Java 泛型,V扩展T,即使不兼容类型也没有错误
我不熟悉泛型。我从下面的语法中了解到,V应该和T相同或是T的子类,但这并没有显示编译错误,即使V是整数而T是字符串数组,也返回FalseJava 泛型,V扩展T,即使不兼容类型也没有错误,java,generics,Java,Generics,我不熟悉泛型。我从下面的语法中了解到,V应该和T相同或是T的子类,但这并没有显示编译错误,即使V是整数而T是字符串数组,也返回False class GenMethDemo { public static <T ,V extends T> boolean isIn( T x, V[] y) { for ( int i =0; i< y.length; i++ ) if ( x.equals(y[i]) ) return tr
class GenMethDemo {
public static <T ,V extends T> boolean isIn( T x, V[] y) {
for ( int i =0; i< y.length; i++ )
if ( x.equals(y[i]) ) return true;
return false;
}
}
public class App {
public static void main(String[] args) {
String b[] = {"are", "how", "YOU"};
System.out.println(GenMethDemo.isIn(1, b));
}
}
class-GenMethDemo{
公共静态布尔isIn(tx,V[]y){
对于(int i=0;i
但是,如果我将
替换为
,则行为与预期一样 在Java 5/6/7中,将Integer
作为T
和String
作为V
传递给此类泛型方法将导致“绑定不匹配”编译器错误,除非您显式地将第一个参数强制转换为对象
在Java 8中,为了满足所提供参数的T
和V
之间的关系,T
被推断为?扩展对象
,它允许V
成为字符串
,而不会导致错误
当您限制为
时,没有类型T
和V
的组合可以满足Integer
和String
——即使T
属于尽可能广泛的类型compariable
,它也不是String
的超类型。因此,您得到了预期的编译器错误。T
在这种情况下被视为对象
,因此String[]
非常适合。那么泛型有什么用呢,不是为了强类型安全吗?至少在运行时,这应该显示一个错误,因为T现在是一个整数。还有为什么在使用可比接口时会导致错误。字符串和整数都是可比较的。回到您的示例:签名静态布尔值isIn(tx,T[]y)
足够有效equals()
在大多数情况下只适用于相同的类型。“因为T现在是一个整数”-
T可以是integer
,也可以是可比较的,数字
,可序列化的和对象。选择T
的具体类型时也考虑了其他参数的类型。