阅读Robert Sedgewick关于算法的书,我总是看到他提到在java数组中包含其他通用事物的东西,需要像这样创建:
Foo<Bar>[] foo = (Foo<Bar>[])new Foo[N];
所以我想知道是否有必要进行演员表,因为当我这样做时:
Foo<Bar>[] foo = new Foo[N];
编译器似乎仍然知道泛型类型是Bar。
那么,是否有必要,有什么意义呢?
答案 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
}