我有三个班级:A,B和C. C 延伸 B , B 延伸 A < / strong>即可。 我还使用以下代码获得了通用类 indClass2 :
indClass2.java
package myproject;
public class indClass2 <T extends A> {
static void hello(indClass2<? super B> a){
System.out.println("hello from super B");
}
static void hello(indClass2<? extends B> a){
System.out.println("hello from extends B");
}
}
indClass2<? super B>
和indClass2<? extends B>
互相排斥。
helloworld.java
package myproject;
public class helloworld {
public static void main(String[] args) {
indClass2<A> a = new indClass2<A>();
indClass2<B> b = new indClass2<B>();
indClass2<C> c = new indClass2<C>();
indClass2.hello(a);
indClass2.hello(b);
indClass2.hello(c);
}
}
我有例外:
Exception in thread "main" java.lang.Error:
Unresolved compilation problem:
The method hello(indClass2<? super B>) in the type indClass2 is not applicable for the arguments (indClass2<C>)
at myproject.helloworld.main(helloworld.java:12)
我怎样才能在 indClass2 中认识到hello()
?
答案 0 :(得分:0)
如果您编译代码,您可以看到erasure
代理:)
error: name clash: hello(indClass2<? extends B>) and hello(indClass2<? super B>) have the same erasure
static void hello(indClass2<? extends B> a){
答案 1 :(得分:-2)
indClass2<? super B>
和indClass2<? extends B>
互相排斥。
看起来它们彼此排斥,但在Java World中却没有!
这两个都具有相同的擦除,并且这些方法具有完全相同的签名,因此您将收到编译错误。
name clash: hello(indClass2<? extends B>) and hello(indClass2<? super B>)
have the same erasure
如果您这样做是为了了解/了解有关Java或Type Erasure的更多信息,请阅读官方文档:
中进行深入分析