java - 对象初始化语法:someVar =(SomeClass [])Object [aVariable]

时间:2017-12-05 16:06:18

标签: java

来自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];
    } ...

2 个答案:

答案 0 :(得分:2)

你可以这样分解:

初始化大小为new Object

initCapacity数组
Object [] someValues = new Object[initCapacity];
Comparable [] someComparable = new Comparable[initCapacity];

然后将数组类型转换为类型Value

的数组
vals = (Value[]) someValues;
keys = (Keys[]) someComparable;

您上面的陈述是在单行上进行这些操作。 请注意,您已将vals数组Valueskeys声明为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());
}