分为三类:
class A{
}
class B{
}
class Gen<T, V extends T>{
}
以下程序将无法编译:
class Main{
public static void main(String[] args){
Gen<A, B> g;
}
}
因为它V
必须与它相同T
或它的子类。
现在有这段代码:
class Main{
public static <T, V extends T> void qq(T x, V y){
}
public static void main(String[] args){
qq(new A(), new B());
}
}
我希望它不会以相同的方式编译,因为它B
不继承自A
,但它仍然工作得很好。为什么?
在
Gen<A, B> g
您明确指出T=A
并且V=B
- 由于显而易见的原因,这无法编译,类型不兼容。在您没有明确
qq(new A(), new B())
指定类型的情况下,编译器会进行类型推断,即 找到合适的。在这种情况下,我发现and 。qq
T=Object
V=B
如果您明确指定 types
Main.<A, B>qq(new A(), new B())
,您将收到相同的错误。