Java中的多个有界泛型
我有A类,接口B,C。aA扩展了A,aB实现了B,cC实现了C。但如果我尝试使用多个绑定泛型,它显示了使用JDK1.7时的编译错误。 请帮我纠正错误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{
公共类多个文件夹{
公共静态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
@sunleot扩展a&B
意味着您期望的类型是a和B。但是您需要用泛型声明D
类才能看到它。请参阅我的最后一段。但是or和or没有区别。因为这样,多重有界类型的用法是什么。@sunleo一旦使用参数化类型,您就会看到区别。您不能创建D
,但是您可以创建D
@sunleot扩展a&B
意味着您期望的类型是a和B。但是您需要用泛型声明D
类才能看到它。请看我的最后一段。谢谢你的回答。谢谢你的回答。