Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java没有';不允许泛型类的内部类数组_Java_Arrays_Generics - Fatal编程技术网

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

我知道不能创建泛型类型的数组,而必须求助于黑客。(考虑到Java支持泛型数组,而不是它们的创建,我不清楚为什么黑客比Java支持创建泛型数组更好)

而不是写这个

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]