【发布时间】:2012-03-28 19:23:07
【问题描述】:
这样的声明:
class A<X extends Number & List> { }
是允许的。而这样的声明是不允许的。
class A<? extends Number & List> { }
对于为什么 Java 限制我们这样做,有什么合乎逻辑的解释吗?
&
之间的实际区别是什么 <T extends Number>
& <? extends Number>?
【问题讨论】:
-
你真的有一个扩展
Number并实现List的类吗?还是扩展Number并实现List<Number>?还是 X 扩展Number并实现List<X>?你怎么写最后一个而不在某处声明类型X? -
好点——
Number和List并不是你希望像那样共存的真正类型。 -
@LouisWasserman:即使它们确实像那样共存,我只是指出您可能需要通用定义来指定您的列表所包含的内容。无论哪种方式,最好避免使用原始类型。
-
@PaulHanbury: 测试和编译成功。Number & List 只是举例。你可以用任何自定义的类名,接口名替换它们。这里的重点是为什么不允许使用通配符在泛型类/方法声明中。
-
@DebadyutiMaiti:按照您的逻辑,我应该对以下代码感到满意,因为它可以编译并通过测试:
public class Math {public static int multiply(int x,int y){int p = 0;for(int i=0;i<x;i++) for(int j=0;j<y;j++)p++;return p;}}我对此不满意。同样,我认为使用原始列表也不是一个好主意……尤其是在模板类中。
标签: java generics compiler-construction jvm bounded-wildcard