2015-09-05 59 views
0

在从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

您不能实例化通用数组类型。因此,他们使用原始类型并投射它。 –

+0

[this]的可能重复(http://stackoverflow.com/questions/14917375/cannot-create-generic-array-of-how-to-create-an-array-of-mapstring-obje)问题。 – bcsb1001

+0

@ bcsb1001你认为这是重复的问题吗? – overexchange

回答

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>>

+0

首先,为什么我们需要静态类节点实现Map.Entry {}'?当我们想创建原始类型数组'new Node [newCap]'。它可以是'静态类节点实现Map.Entry {}'? – overexchange

+2

你不想要一个原始类型数组,但你想要一个泛型类型数组,但是你不能直接创建它。 – Jack

+0

'Node [] newTab =(Node [])new Node [newCap];'**和**'Node [] newTab = new Node [ newCap];'? – overexchange

0

不允许泛型数组的原因是由于Java的类型擦除。即使CollectionsList<T>仅在访问对象时在ObjectT之间投射。查看仿制药最安全的方式是使用Collections.checkedCollection,它采用Collection<E>Class<E>并在运行时检查类型,以防止编译器在编译时发出警告。

+0

问题是,行'Node [] newTab =(节点 [])new Node [newCap];'在'java.util.HashMap'中工作,但是'Node [] newTab = [节点 []] )new Node [10];'在这个[示例]中不起作用(https://github.com/shamhub/Java_programming/blob/master/JavaCode/src/StaticMemberClasses/NestedInterfaceInInterface.java)。为什么? – overexchange

+1

@overchange由于您没有在类声明中指定类型参数'K,V'?将其更改为'公共类NestedInterfaceInInterface '。 –

+0

这也行不通。他们正在用'static'方法尝试代码。使方法通用或者以其他方式引入类型参数。 –