首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有更干净的方法来初始化这个泛型数组?

是否有更干净的方法来初始化这个泛型数组?
EN

Stack Overflow用户
提问于 2009-08-12 21:30:31
回答 3查看 441关注 0票数 1

昨天,我尝试创建一个对象数组,属于泛型类的非静态内部类。这样做似乎没有什么好办法。

第一次尝试:

代码语言:javascript
复制
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”是隐式泛型的,因此会导致以下错误:

代码语言:javascript
复制
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)  

第二次尝试:

代码语言:javascript
复制
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{}  
}  

这不起作用,因为数组只能从最近已知的非泛型类型转换为泛型类型。对于泛型栏,最近已知的非泛型类型是非泛型条,它不能(很容易吗?)在父类的上下文中引用。导致以下错误:

代码语言:javascript
复制
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)

最后尝试:

代码语言:javascript
复制
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{}  
}

但是,如果希望在构造函数中创建数组,还需要一个(私有)虚拟构造函数,这样就可以得到类。

此外,如果父类是抽象的,则需要为所有抽象方法提供虚拟实现。

当我写完这篇文章时,我意识到

代码语言:javascript
复制
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{}  
}

工作也一样,我想我还是发吧。但是,它仍然很难看,没有理由证明普通语法不起作用。

EN

回答 3

Stack Overflow用户

发布于 2009-08-12 21:39:21

如果您也将Bar声明为静态类,那么以下代码(即最明显的代码)将在编译和运行时运行:

代码语言:javascript
复制
Bar[] bar = new Bar[11];

编辑

使用java.lang.reflect.Array.newInstance是在运行时分配新泛型数组的首选方法。

票数 2
EN

Stack Overflow用户

发布于 2009-08-12 21:42:17

如果需要保持“隐式泛性”,即不能使类保持静态,则可以执行Bar[] bar = new Bla.Bar[11];,但会收到警告。

票数 2
EN

Stack Overflow用户

发布于 2009-08-13 03:16:00

代码语言:javascript
复制
List<Bar> bars = new ArrayList<Bar>();

排序(呃,订购)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1268829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档