据我所知,以下代码应该在没有任何编译错误的情况下运行。
然而,当我运行这个程序时,我遇到了编译错误。
成员类型B.D无法使用参数化类型进行限定, 因为它是静态的。从限定类型B
中删除参数
{{1}}
请帮助我理解这种行为。
答案 0 :(得分:4)
以类似于内部static
类的方式,嵌套接口与其外部类的实例没有关联,只与该类本身有关联。无论static
的类型参数如何,所有B
成员都在B
的所有实例之间共享。考虑:
class B<T> {
public static int shared = 0;
}
变量shared
在B<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>
中没有任何意义。