我是仿制药的新手。我从下面的语法中理解的是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));
}
}
但是,如果我将<T,V extends T>
替换为<T extends Comparable<T>, V extends T>
,则行为符合预期。
答案 0 :(得分:6)
在Java 5/6/7中,将Integer
作为T
和String
作为V
传递给此类通用方法会导致&#34;绑定不匹配&#34;编译器错误,除非您明确地将第一个参数强制转换为Object
。
在Java 8中,由于improved type inference,为了满足T
和V
之间关于提供的参数的关系,T
被推断为? extends Object
,这允许V
为String
,不会导致错误。
限制为<T extends Comparable<T>, V extends T>
时,T
和V
类型的组合不能满足Integer
和String
- 即使{ {1}}属于尽可能宽的类型T
,它不是Comparable<Integer>
的超类型。因此,您按预期收到编译器错误。