在java.util.HashMap
的以下语法中,在实例化原始类型数组后,通用类型参数用于类型转换,
Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];
类似的代码不会使用类似的语法编译here(如下所示),提供错误:Type safety: Unchecked cast from Node[] to Node<K,V>[]
public class NestedInterfaceInInterface {
public static void main(String[] args) {
Node<K,V>[] newTab = (Node<K,V>[])new Node[10];
//Node<String,String>[] newTab = (Node<String,String>[])new Node[10]; // this works
}
}
1)如何解决此错误?
2)语法Node<K,V>[] newTab = (Node<K,V>[])new Node[10];
与Node<String,String>[] newTab = (Node<String,String>[])new Node[10];
的区别如何?
答案 0 :(得分:3)
问题在于you can't create an array of a generic type in Java所以你不得不手动将Node[]
的原始类型数组投射到Node<K,V>[]
。
该操作称为type conversion,可在多种场合使用。在这种情况下,你正在做一个不安全的向下转发,它会产生警告
类型安全:从
取消选中Node[]
到Node<K,V>[]
但你可以抑制它以防万一。请注意,没有办法阻止此警告,您可以考虑使用不会出现此类问题的List<Node<K,V>>
。
答案 1 :(得分:0)
不允许通用数组的原因是由于Java的类型擦除。在访问对象时,即使Collections
List<T>
仅在Object
和T
之间进行投射。查看泛型的最类型安全的方法是使用Collections.checkedCollection
,Collection<E>
和Class<E>
并在运行时检查类型,防止编译时发出编译器警告。