所以我有这个我正在开发的通用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) 在回答有关此问题的问题时: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.