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类型必须为同时实现接口一和二编辑器才不会出错
以上没有什么实际意义,只是我对泛型语法格式的一个总结!

浙公网安备 33010602011771号