Java中的静态和非静态与泛型和通配符
考虑下面的例子Java中的静态和非静态与泛型和通配符,java,generics,static,wildcard,Java,Generics,Static,Wildcard,考虑下面的例子 class test<E>{ public int getNum(int i){ return i; } public E getNum1(E i){ return i; } public static <E> E getNum(E i){ return i; } } 类测试{ 公共整数getNum(整数i){ 返回i; } 公共E getNum1
class test<E>{
public int getNum(int i){
return i;
}
public E getNum1(E i){
return i;
}
public static <E> E getNum(E i){
return i;
}
}
类测试{
公共整数getNum(整数i){
返回i;
}
公共E getNum1(E i){
返回i;
}
公共静态E getNum(ei){
返回i;
}
}
第一个方法声明:返回类型已知
第二个方法声明:返回类型未知
第三种方法声明:返回类型为某种未知+静态
问题:当静态方法用于泛型时,必须指定类型参数
。为什么会这样?或者类型参数到底意味着什么?它的目的是什么?当方法是非静态的时,我们没有类型参数,尽管在这种情况下,我们在类声明中有
,例如公共类{…}
考虑一下这个通配符
//This does not compile, how to make it correct
public static getIndex(List<?>, int index){
return list.get(index);
}
public static <E> E getIndex1(List<E> list, int index){
return list.get(index);
}
//这不可编译,如何使其正确
公共静态getIndex(列表,int索引){
返回列表。获取(索引);
}
公共静态E getIndex1(列表,int索引){
返回列表。获取(索引);
}
同样,第一个方法不编译。我不知道如何使用无界通配符对返回类型进行编译
上面两种方法声明之间的区别是什么
通配符
?
表示任何类型,而E
表示某些未知类型
既然任何类型
都是某个未知类型
正确,那么这又有什么关系呢?问题:当对泛型使用静态方法时,必须指定类型参数。为什么会这样?或者类型参数到底意味着什么?它的目的是什么?当方法是非静态的时,我们没有类型参数,尽管在本例中我们有类内声明,例如公共类{…}
static
方法不属于实例,它属于类。类没有泛型类型(实例有)
因此,拥有一个
class test<E>{
public static E getNum(E i){
return i;
}
}
这个
E
不是未知类型。它是在创建实例时选择的定义良好的类型
Test<String> test = new Test<>();
Test Test=新测试();
E
是String
引用
E表示一些未知类型,您可以在以后命名和引用?
指示某些未知类型,您不知道该类型的名称,也无法引用该类型
稍后
阅读。问题会让您受益匪浅:当静态方法用于泛型时,必须指定类型参数。为什么会这样?或者类型参数到底意味着什么?它的目的是什么?当方法是非静态的时,我们没有类型参数,尽管在本例中我们有类内声明,例如公共类{…}
static
方法不属于实例,它属于类。类没有泛型类型(实例有)
因此,拥有一个
class test<E>{
public static E getNum(E i){
return i;
}
}
这个
E
不是未知类型。它是在创建实例时选择的定义良好的类型
Test<String> test = new Test<>();
Test Test=新测试();
E
是String
引用
E表示一些未知类型,您可以在以后命名和引用?
指示某些未知类型,您不知道该类型的名称,也无法引用该类型
稍后
阅读.会让您受益匪浅。因此,类型参数的含义是什么?@user方法上的类型参数声明需要定义只有该方法才会使用的泛型类型。类上的类型参数声明是定义实例方法和字段可以使用的类型参数所必需的。如何为通配符提供返回声明?我知道我没有提供返回,但将
?
作为返回类型是没有意义的。此外,这也不会编译公共静态E getIndex(List@user1988876如果使用通配符,则不能声明通配符类型的返回,因为您不知道它是什么(它是通配符)。您显示的行没有编译,因为您没有为列表
参数提供变量。那么类型参数是什么意思?@user方法上的类型参数声明需要定义只有该方法才会使用的泛型类型。类上的类型参数声明需要定义nstance方法和字段可以使用。如何为通配符提供返回声明?我知道我没有提供返回,但将?
作为返回类型是没有意义的。此外,这也不会编译公共静态E getIndex(List@user1988876如果使用通配符,则不能声明通配符类型的返回,因为您不知道它是什么(它是通配符)。您显示的行没有编译,因为您没有为列表
参数提供变量。E
表示一些未知类型,您可以稍后命名和引用。?
表示一些未知类型,您没有命名,以后也无法引用。@LouisWasserman我偷了您的报价是为了我自己的目的。E
>表示某些未知类型,您可以稍后命名和引用。?
表示某些未知类型,您不命名,以后无法引用。@LouisWasserman我偷了您的报价是为了我自己的目的。
Test<String> test = new Test<>();