我是仿制药的新手.我从下面的语法中理解的是V应该是T的相同或子类,但是这显示没有编译错误,即使V是整数而T String数组也返回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 true;
return false;
}
}
public class App {
public static void main(String[] args) {
String b[] = {"are", "how", "YOU"};
System.out.println(GenMethDemo.isIn(1, b));
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我更换<T,V extends T>
与<T extends Comparable<T>, V extends T>
该行为是按预期.
在Java 5/6/7中,传递Integer
as T
和String
as V
这样的泛型方法会导致"绑定不匹配"编译器错误,除非您明确地将第一个参数强制转换为Object
.
在Java 8,由于改进的类型推断,以满足关系T
和V
所提供的参数,T
推断为? extends Object
,它允许V
为String
,不导致的误差.
当你限制时<T extends Comparable<T>, V extends T>
,没有这种类型的组合,T
并且V
可以满足Integer
并且String
- 即使T
属于尽可能宽的类型Comparable<Integer>
,它也不是超类型String
.因此,您将按预期获得编译器错误.