Java没有';不允许泛型类的内部类数组
我知道不能创建泛型类型的数组,而必须求助于黑客。(考虑到Java支持泛型数组,而不是它们的创建,我不清楚为什么黑客比Java支持创建泛型数组更好) 而不是写这个Java没有';不允许泛型类的内部类数组,java,arrays,generics,Java,Arrays,Generics,我知道不能创建泛型类型的数组,而必须求助于黑客。(考虑到Java支持泛型数组,而不是它们的创建,我不清楚为什么黑客比Java支持创建泛型数组更好) 而不是写这个 Map.Entry<K, V>[] entries = new Map.Entry<K, V>[numEntries]; 这是最“优雅”的解决方案吗 我看了一下,但这里的解决方案更糟。是否可以选择将内部类设置为静态的 如果可能,您应该能够使用标准方法创建内部类的数组: public class Outer&l
Map.Entry<K, V>[] entries = new Map.Entry<K, V>[numEntries];
这是最“优雅”的解决方案吗
我看了一下,但这里的解决方案更糟。是否可以选择将内部类设置为静态的
如果可能,您应该能够使用标准方法创建内部类的数组:
public class Outer<E> {
final Inner[] inners = new Inner[16]; // works
static class Inner {
}
}
公共类外部{
最终内部[]内部=新内部[16];//有效
静态类内部{
}
}
执行以下操作:
@SuppressWarnings("unchecked")
final Inner[] inners = (Inner[])new Outer<?>.Inner[16];
@SuppressWarnings(“未选中”)
最终内部[]内部=(内部[])新的外部.Inner[16];
与第一个示例相当的是新的Outer.internal[16]
,但这将隔离未检查的强制转换并避免原始类型。您需要了解的是,您的情况与您描述的第一个情况相同
internal
是Outer
的非静态内部类,是泛型类。这意味着internal
在类型参数的范围内,简单地编写internal
是Outer.internal
的缩写。i、 e.它可能看起来不像它,但只是internal
是一个参数化类型,就像Map.Entry
,因为外部类的类型参数e
隐式成为内部类的类型参数。这两个问题的解决方案是相同的
您对第一个问题的解决方案是创建一个原始类型的数组,即newmap.Entry[numEntries]代码>。这里的原始类型是什么?不是我们已经讨论过的内部。相反,您需要显式限定外部类型以访问原始类型:newouter.Inner[16]代码>。当然,您需要使用强制转换将其强制转换回所需的泛型数组类型:
(Inner[])new Outer.Inner[16]
还有另一种方法可以创建泛型类型的数组,而不使用原始类型——使用通配符类型,即newmap.Entry[numEntries]代码>。我们的情况下的等价物是new Outer.Inner[16]代码>。演员阵容:
(Inner[])new Outer<?>.Inner[16]
(内部[])新的外部.内部[16]
我认为,您的第一行和第二行代码有些混淆entries
声明为(单个)Map.Entry
对象,但您正在尝试分配一个Map.Entrie
对象数组。另外,entries
怎么可能也是数组维度呢?@TedHopp感谢您指出这一点。在这两种情况下都是正确的。它必须是数组有什么原因吗?“new(Map.Entry)Map.Entry[numEntries];
”应该是(Map.Entry)new Map.Entry[numEntries]代码>这将通过重构内部
以将外部
作为参数而不是非静态参数来实现。
@SuppressWarnings("unchecked")
final Inner[] inners = (Inner[])new Outer<?>.Inner[16];
(Inner[])new Outer.Inner[16]
(Inner[])new Outer<?>.Inner[16]