从原始类型转换为泛型类型

时间:2015-09-05 14:34:03

标签: java arrays generics

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];的区别如何?

2 个答案:

答案 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>仅在ObjectT之间进行投射。查看泛型的最类型安全的方法是使用Collections.checkedCollectionCollection<E>Class<E>并在运行时检查类型,防止编译时发出编译器警告。