我应该新列表[N]&#39;或&#39;(List <integer> [])新列表[N]&#39;在java中,当我想要一个整数列表数组?

时间:2015-09-28 21:20:03

标签: java arrays generics

阅读Robert Sedgewick关于算法的书,我总是看到他提到在java数组中包含其他通用事物的东西,需要像这样创建:

Foo<Bar>[] foo = (Foo<Bar>[])new Foo[N];

所以我想知道是否有必要进行演员表,因为当我这样做时:

Foo<Bar>[] foo = new Foo[N];

编译器似乎仍然知道泛型类型是Bar。

那么,是否有必要,有什么意义呢?

3 个答案:

答案 0 :(得分:1)

您应该使用Foo<Bar>[] foo = new Foo[N];

您可能收到如下警告:

Type safety: The expression of type Foo[] needs unchecked conversion to conform to Foo<Bar>[]

您可以使用@SuppressWarnings("unchecked")隐藏

@SuppressWarnings("unchecked")
Foo<Bar>[] foo = new Foo[N];

答案 1 :(得分:-1)

演员是强制类型安全。第一行不编译,因为类型错误。第二个编译很好,但很可能在运行时会出错。

public class Test {

    public static void main(String[] args) {
        Foo<Bar>[] foo1 = (Foo<Bar>)new Foo[] {new Foo<String>()};
        Foo<Bar>[] foo2 = new Foo[] {new Foo<String>()};
    }

    static class Bar {}
    static class Foo<T> {}
}

答案 2 :(得分:-3)

这两者之间确实没有区别。两者都需要未经检查的演员表。你不应该混合数组和泛型。未经检查的演员表破坏了泛型的全部目的。它会在意想不到的地方导致ClassCastExceptions。例如:

static class Foo<T> {
    T value;
    public Foo(T v) {
        value = v;
    }
}

public static void main(final String[] args) throws IOException {
    @SuppressWarnings("unchecked")
    Foo<Boolean>[] foo = new Foo[1];

    ((Object[])foo)[0] = new Foo<Integer>(0);
    foo[0].value.booleanValue(); // runtime error will occur here
}