我有A类,接口B,C。 aA扩展A,aB实现B,cC实现C.But如果我尝试使用MultipleBounded Generics。它使用jdk 1.7显示编译错误。 请帮我纠正错误。 LINK FOR REFERENCE
public class MultipleBounds {
public static void main(String args[])
{
D d1 = new D();
d1.print(new bB()); // compilation Error
d1.print(new cC()); // compilation Error
d1.print(new aA()); // It works no Issues
}
}
class A {
public void method() {
System.out.println("methodA");
}
}
interface B {
public void method();
}
interface C {
public void method();
}
class aA extends A {
public void method() {
System.out.println("methodaA");
}
}
class bB implements B {
public void method() {
System.out.println("methodbB");
}
}
class cC implements C {
public void method() {
System.out.println("methodcC");
}
}
class D<T extends A & B & C>
{
public void print(T t)
{
t.method();
}
}
答案 0 :(得分:3)
由于您使用原始类型D
来调用该方法,因此该类中的所有通用信息都将丢失。方法print
将被它的删除所取代。
现在,类型参数T
的擦除是它具有的最左边界限,即A
。这在JLS §4.6中很明显:
类型变量(第4.4节)的擦除是其最左边界的擦除。
那么,编译器看到的是:
class D {
public void print(A t)
{
t.method();
}
}
这就是为什么,它适用于A
,而不适用于B
和C
。课程:Avoid using raw types.
答案 1 :(得分:2)
问题在于:D d1 = new D();
。您正在使用原始类型,因此丢失了泛型信息。类型交集A & B & C
的类型擦除是its first component(A
)。因此,d1
只能接受A
s。
例如,如果您将其重新排序为B & A & C
,则只能传递B
。
最后请注意,您无法使用泛型声明D
,因为代码中的任何类都不是A
,B
和C
。您可以创建class ABC extends A implements B, C
并使用D<ABC> d = new D<>();