来自https://introcs.cs.princeton.edu/java/44st/BinarySearchST.java.html的以下代码段
keys = (Key[]) new Comparable[initCapacity];
做了什么?
public class BinarySearchST<Key extends Comparable<Key>, Value> {
private static final int INIT_SIZE = 8;
private Value[] vals; // symbol table values
private Key[] keys; // symbol table keys
private int n = 0; // number of elements
public BinarySearchST() {
this(INIT_SIZE);
}
public BinarySearchST(int initCapacity) {
vals = (Value[]) new Object[initCapacity];
keys = (Key[]) new Comparable[initCapacity];
} ...
答案 0 :(得分:2)
你可以这样分解:
初始化大小为new Object
initCapacity
数组
Object [] someValues = new Object[initCapacity];
Comparable [] someComparable = new Comparable[initCapacity];
然后将数组类型转换为类型Value
vals = (Value[]) someValues;
keys = (Keys[]) someComparable;
您上面的陈述是在单行上进行这些操作。
请注意,您已将vals
数组Values
和keys
声明为Keys
数组。
答案 1 :(得分:1)
在这种情况下,Key
是通用类型。特别是它是一种扩展Comparable
的类型。
由于类型擦除无法创建泛型类型的数组,因此需要创建该泛型类型的超类型/接口数组。在这种情况下,我们知道Comparable
是泛型类型Key
的接口,因此在内存中创建Comparables
数组,然后转换为泛型类型Key
< / p>
这里有更多例子(也可以实现可比性):
static <T extends Comparable> T[] genericMethod(T someObj) {
T[] arrayOfTypeT = (T[]) new Comparable[1];
arrayOfTypeT[0] = someObj;
return arrayOfTypeT;
}
// String extends Comparable
public static void main(String[] args) {
String[] arrayOfString = genericMethod("A string");
Integer[] arrayOfInt = genericMethod(new Integer(1));
// this one doesn't compile, because it doesn't extend Comparable
Object[] arrayOfObject = genericMethod(new Object());
}