Java中的多个有界泛型

时间:2014-01-18 12:02:14

标签: java generics

我有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();
    }
}

2 个答案:

答案 0 :(得分:3)

由于您使用原始类型D来调用该方法,因此该类中的所有通用信息都将丢失。方法print将被它的删除所取代。

现在,类型参数T的擦除是它具有的最左边界限,即A。这在JLS §4.6中很明显:

  

类型变量(第4.4节)的擦除是其最左边界的擦除。

那么,编译器看到的是:

class D {
    public void print(A t)
    {
        t.method();
    }  
}

这就是为什么,它适用于A,而不适用于BC。课程:Avoid using raw types.

答案 1 :(得分:2)

问题在于:D d1 = new D();。您正在使用原始类型,因此丢失了泛型信息。类型交集A & B & C的类型擦除是its first componentA)。因此,d1只能接受A s。

例如,如果您将其重新排序为B & A & C,则只能传递B

最后请注意,您无法使用泛型声明D,因为代码中的任何类都不是ABC。您可以创建class ABC extends A implements B, C并使用D<ABC> d = new D<>();