java泛型语法格式

java泛型

先看个例子

1.泛型类

/**<C>===<C extends Object>,当然可以直接对此类进行限制,写成Test<C extends User>{
...
}*/
public class Test<C>{
    private C c;
    //下面两个其实就是实例方法语法格式里的
    void init(C c){
	this.c = c;
    }
    C getC(){
	return this.c;
    }
    //1.静态方法
    //静态泛型方法格式一:这里的返回值类型void和C,其实一个道理,这里就不区分了
    //正确写法
    static <C extends User> void myPrint(C c){
	if( c!= null){//
            System.out.println(c.name);
	}
    }
    //错误写法,这里语法错误原因也好理解,可以理解为C这个类不存在
    //而上述正确的语法格式,一方面说明了方法是泛型方法,并且还对参数类型做了限制(必须为User或者User子类类型)
    static void myPrint(C c){
	...
    }
    //静态泛型方法格式二
    static <C> C getC1(C c){
	retutn c;
    }
    //错误写法和上面类似,就不写了
	
    //2.实例方法
    //格式一:这里也是对参数类型做了限制,但是没有super关键字用法将extends替换为super编译不通过,因为多态是向下继承的
    <C extends User> C getC3(C c){
  	return c;
    }
    //格式二
    C getC2(C c){
	return c;
    }
	
    //3.通配符
    //List<?>实际上就等价于List<? extends Object>,List也是泛型类List<E>
    //不过?这个通配符只能在参数列表中使用
    void test(List<?> list){
	if(list.get(0) != null){
            for (Object o:list){
		if(o instanceof User){
		    System.out.println(((User)o).name);
		}
            }
	}
    }
    //以下是上面的简写
    void test2(List<? extends User> list){
	if(list.get(0) != null){
      	    for (User user:list){//这里有多态
		System.out.println(user.name);
	    }
	}
    }
    //出现一个问题,这个编译不通过
    <C> C getError(){
    //这个好像比较模糊或者冲突
	return this.c;//返回类型一样啊
    }
    //解决
    <T> C getRight(T t){
	return this.c;
    }
	
}
class User{
    String name = "zyt";
}

2.非泛型类

public class Test{
    //这里就没有上面泛型类的私有属性了,因为我在当前目录下并没有创建C.java
    //1.静态方法
    static <T> T get(T t){
	return t;
    }
    //2.实例方法
    <T> T getT(T t){
	return t;
    }
	
}

3.通配符和泛型参数

//1.通配符?和泛型参数T的区别
List<T> list = new ArrayList<>();
List<?> list2 = new ArrayList<>();//虽然编辑器不报错,但是没有什么意义,通配符?一般用在方法中

//2.类型参数可以保证参数的一致性
public <T extends Number> void test(List<T> a, List<T> b);//可以保证两个list中的参数类型一致

public void test(List<? extends Number> a, List<? extends Number> b);//不能保证

//3.类型参数只有一种限定方式:T extends A
//通配符?有两种限定方式:? extends A;? super A;

//4.类型参数可以有多重限定而通配符不可以
static <C extends interface1 & interface2> C get3(C c) {
    return c;
}//这里的C类型必须为同时实现接口一和二编辑器才不会出错

以上没有什么实际意义,只是我对泛型语法格式的一个总结!

posted @ 2021-05-10 22:17  SowHappy  阅读(285)  评论(0)    收藏  举报