昨天,我尝试创建一个对象数组,属于泛型类的非静态内部类。这样做似乎没有什么好办法。
第一次尝试:
public class Wibble<T>{
public static void main(String...args){
new Wibble<String>();
}
public Wibble(){
Bar[] bar = new Bar[11];
}
static class Foo{}
class Bar extends Foo{}
}这是不起作用的,因为“Wibble”上下文中的“Bar”是隐式泛型的,因此会导致以下错误:
Exception in thread "main" java.lang.Error:
Unresolved compilation problem: Cannot create a generic array of Wibble<T>.Bar
at Wibble.<init>(Wibble.java:7)
at Wibble.main(Wibble.java:4) 第二次尝试:
public class Wibble<T> {
public static void main(String...args){
new Wibble<String>();
}
public Wibble(){
Bar[] bar = (Bar[])new Foo[11];
}
static class Foo{}
class Bar extends Foo{}
} 这不起作用,因为数组只能从最近已知的非泛型类型转换为泛型类型。对于泛型栏,最近已知的非泛型类型是非泛型条,它不能(很容易吗?)在父类的上下文中引用。导致以下错误:
Exception in thread "main" java.lang.ClassCastException:
[LWibble$Foo; cannot be cast to [LWibble$Bar;
at Wibble.<init>(Wibble.java:7)
at Wibble.main(Wibble.java:4)最后尝试:
public class Wibble<T> {
private static final Class<?> BARCLASS = new Wibble<Object> (false).new Bar().getClass();
public static void main(String...args){
new Wibble<String>();
}
private Wibble(boolean flag){}
public Wibble(){
Bar[] bar = (Bar[])Array.newInstance(BARCLASS, 11);
}
static class Foo{}
class Bar extends Foo{}
}但是,如果希望在构造函数中创建数组,还需要一个(私有)虚拟构造函数,这样就可以得到类。
此外,如果父类是抽象的,则需要为所有抽象方法提供虚拟实现。
当我写完这篇文章时,我意识到
public class Wibble<T> {
public static void main(String...args){
new Wibble<String>();
}
private Wibble(boolean flag){}
public Wibble(){
Bar[] bar = (Bar[])Array.newInstance(Bar.class, 11);
}
static class Foo{}
class Bar extends Foo{}
}工作也一样,我想我还是发吧。但是,它仍然很难看,没有理由证明普通语法不起作用。
发布于 2009-08-12 21:39:21
如果您也将Bar声明为静态类,那么以下代码(即最明显的代码)将在编译和运行时运行:
Bar[] bar = new Bar[11];编辑
使用java.lang.reflect.Array.newInstance是在运行时分配新泛型数组的首选方法。
发布于 2009-08-12 21:42:17
如果需要保持“隐式泛性”,即不能使类保持静态,则可以执行Bar[] bar = new Bla.Bar[11];,但会收到警告。
发布于 2009-08-13 03:16:00
List<Bar> bars = new ArrayList<Bar>();排序(呃,订购)。
https://stackoverflow.com/questions/1268829
复制相似问题