对于具有通用接口的Generic类,编译失败

时间:2017-08-09 08:49:19

标签: java generics

据我所知,以下代码应该在没有任何编译错误的情况下运行。

然而,当我运行这个程序时,我遇到了编译错误。

  

成员类型B.D无法使用参数化类型进行限定,   因为它是静态的。从限定类型B

中删除参数
{{1}}

请帮助我理解这种行为。

3 个答案:

答案 0 :(得分:4)

以类似于内部static类的方式,嵌套接口与其外部类的实例没有关联,只与该类本身有关联。无论static的类型参数如何,所有B成员都在B的所有实例之间共享。考虑:

class B<T> {
    public static int shared = 0;
}

变量sharedB<String>B<Integer>B<Object>中是相同的,依此类推。尝试在参数化B上访问它会导致编译错误:

int copy = B<String>.shared; // <<== Does not compile

因此,B的类型参数对arr的声明没有影响,因此Java希望您将其删除:

B.D<String>[] arr = new B.D[10];

答案 1 :(得分:2)

首先,您可以创建具体参数化类型的数组。示例:

Pair<Integer,Integer>[] intPairArr = new Pair<Integer,Integer>[10]; // illegal 

不起作用。有关详细信息,请参阅here

但看起来编译器在这里给出了一个不同的,不太有用的错误消息,因为它首先因为嵌套接口类似于这一事实而绊倒静态内部类。

所以,你唯一能做的就是:忽略赋值的rhs上的泛型:

B.D<String>[] arr = new B.D[10];

当然会导致类型安全警告 - 并且让整个想法让内部接口在某种程度上是过时的。

所以真正的答案可能是:泛型和数组在Java中不能很好地结合在一起 - 首先避免使用它们。并且通过引入接口嵌套导致“更好的用户体验”,使得更复杂并不会感到惊讶。

答案 2 :(得分:1)

内部接口总是static(与类不同)。因此,对于B的参数String在定义new B<String>.D<String>中没有任何意义。