相关疑难解决方法(0)

初始化类型Generic的Java通用数组

所以我有这个我正在开发的通用HashTable类,我想将它一般用于任意数量的传入类型,我想将内部存储数组初始化为LinkedList的数组(用于冲突),其中每个LinkedList都是提前指定的(对于类型安全性),它是HashTable类中泛型的类型.我怎么能做到这一点?以下代码最能说明我的意图,但当然不能编译.

public class HashTable<K, V>
{
    private LinkedList<V>[] m_storage;

    public HashTable(int initialSize)
    {
        m_storage = new LinkedList<V>[initialSize];
    }
}
Run Code Online (Sandbox Code Playgroud)

java generics hash

7
推荐指数
1
解决办法
2万
查看次数

为什么我们可以使用带通用引用的数组

在回答有关此问题的问题时:https://stackoverflow.com/a/9872630/82609

我试着做以下事情:

Comparator<String>[] comparators = new Comparator[] {...};
Run Code Online (Sandbox Code Playgroud)

有用!但以下不是:

Comparator<String>[] comparators = new Comparator<String>[] {...};
Run Code Online (Sandbox Code Playgroud)

在相关问题上,我做了以下假设:

我想这是因为最初的数组合约可能是这样的:

如果你创建一个X类型的数组,你将永远不能在其中放入任何IS-NOT-AN X.如果你尝试,你会得到一个ArrayStoreException

因此,允许使用泛型创建的数组会导致不同的规则,例如:

如果你创建一个类型的数组X<Y>,你将永远不能放置任何IS-NOT-AN X.如果你尝试,你将得到一个ArrayStoreException.但是你可以添加两个X<Y>X<Z>对象,因为类型擦除!


但是考虑一下,它真的会成为一个问题:

Comparator<String>[] comparators = new Comparator<String>[] {...};
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么它不可能,因为使用这样的东西会:

  • 检查在运行时插入的类
  • 检查在编译时插入的类类型

最后,我们可以使用具有泛型类型引用的数组,并且由于不可能创建具有泛型类型的数组,我想很多人甚至不知道它是可能的.

我只是想知道是否有人知道这个选择背后的原因?

这有点像强迫人们使用List<String> = new ArrayList();而不是使用List<String> = new ArrayList<String>();


dimitrisli你从约书亚布洛赫的着名书中给出了一个很好的例子.正如您/他解释的那样,使用泛型数组+协方差并且可能导致ClassCastException是危险的,而我们期望使用协方差从数组中获取ArrayStoreException.

但请注意以下内容仍然合法且导致相同:

List<String>[] stringLists = new List[1];
List<Integer> intList = Arrays.asList(42);
Object[] objects = stringLists;
objects[0] = intList;
String s = stringLists[0].get(0);
Run Code Online (Sandbox Code Playgroud)

但是,它会在编译时生成未经检查的强制转换警告,正如您所提到的,在运行时会产生ClassCastException.

java generics scjp java-ee

6
推荐指数
1
解决办法
581
查看次数

标签 统计

generics ×2

java ×2

hash ×1

java-ee ×1

scjp ×1