Java中的多个有界泛型

Java中的多个有界泛型,java,generics,Java,Generics,我有A类,接口B,C。aA扩展了A,aB实现了B,cC实现了C。但如果我尝试使用多个绑定泛型,它显示了使用JDK1.7时的编译错误。 请帮我纠正错误 公共类多个文件夹{ 公共静态void main(字符串参数[]) { D d1=新的D(); d1.打印(新bB());//编译错误 d1.print(new cC());//编译错误 d1.打印(新aA());//它工作正常,没有问题 } } 甲级{ 公开作废法(){ System.out.println(“methodA”); } } 接口B{

我有A类,接口B,C。aA扩展了A,aB实现了B,cC实现了C。但如果我尝试使用多个绑定泛型,它显示了使用JDK1.7时的编译错误。 请帮我纠正错误

公共类多个文件夹{
公共静态void main(字符串参数[])
{
D d1=新的D();
d1.打印(新bB());//编译错误
d1.print(new cC());//编译错误
d1.打印(新aA());//它工作正常,没有问题
}
}
甲级{
公开作废法(){
System.out.println(“methodA”);
}
}
接口B{
公共无效方法();
}
接口C{
公共无效方法();
}
aA类扩展了{
公开作废法(){
System.out.println(“methodaA”);
}
}
类bB实现了B{
公开作废法(){
System.out.println(“methodbB”);
}
}
类cC实现了C{
公开作废法(){
System.out.println(“methodcC”);
}
}
D类
{
公开作废打印(T)
{
t、 方法();
}
}

问题就在这里:
dd1=newd()。您正在使用原始类型,因此会丢失泛型信息。类型交叉点
a&B&C
的类型擦除为(
a
)。因此,您的
d1
只能接受
A
s

例如,如果将其重新排序为
B&A&C
,则只能通过
B
s


最后请注意,您将无法使用泛型声明
D
,因为代码中没有类是
A
B
C
。您可以创建一个
类ABC扩展a实现B、C
并使用
dd=newd()

问题在这里:
D d1=new D()。您正在使用原始类型,因此会丢失泛型信息。类型交叉点
a&B&C
的类型擦除为(
a
)。因此,您的
d1
只能接受
A
s

例如,如果将其重新排序为
B&A&C
,则只能通过
B
s


最后请注意,您将无法使用泛型声明
D
,因为代码中没有类是
A
B
C
。您可以创建一个
类ABC扩展a实现B、C
并使用
dd=newd()

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

现在,类型参数
T
的擦除是其最左边的边界,即
A
。这表现在:

类型变量(§4.4)的删除是对其最左边边界的删除

所以,编译器看到的是:

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

这就是为什么它适用于
A
,而不适用于
B
C
。课程:

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

现在,类型参数
T
的擦除是其最左边的边界,即
A
。这表现在:

类型变量(§4.4)的删除是对其最左边边界的删除

所以,编译器看到的是:

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

这就是为什么它适用于
A
,而不适用于
B
C
。教训:

但是or和or没有区别。因为那样的话,多重有界类型有什么用。@sunleo一旦使用参数化类型,您就会看到区别。您不能创建
D
,但是您可以创建
D
@sunleo
t扩展a&B
意味着您期望的类型是a和B。但是您需要用泛型声明
D
类才能看到它。请参阅我的最后一段。但是or和or没有区别。因为这样,多重有界类型的用法是什么。@sunleo一旦使用参数化类型,您就会看到区别。您不能创建
D
,但是您可以创建
D
@sunleo
t扩展a&B
意味着您期望的类型是a和B。但是您需要用泛型声明
D
类才能看到它。请看我的最后一段。谢谢你的回答。谢谢你的回答。