【问题标题】:Why array instantiation with a generic type does not work in Java? [duplicate]为什么使用泛型类型的数组实例化在 Java 中不起作用? [复制]
【发布时间】:2014-06-13 15:06:12
【问题描述】:
public interface Foo<E> {

    public void blah(E e);

}

public class MyClass<E> {

    private final Foo<E>[] fooArray = new Foo<E>[8]; // does not compile!

    // (...)

}

解决泛型限制的正确方法是什么?

或者也许这不是限制,我错过了什么?

【问题讨论】:

  • 如果你尝试“new Foo[8]”看看会发生什么?您的实例化需要具体。
  • @JamesBlack 如果你尝试new Foo&lt;Integer&gt;[8],你仍然会得到一个编译错误
  • @chrisapotek 不要添加诸如 this is not a duplicate 之类的内容,这种编辑只会激怒用户。
  • 它是重复的,因为它仍然是由相同的基本问题引起的,但我不会为它与你争吵。这个故事的真正寓意是数组和泛型不能很好地结合在一起。最好使用集合。

标签: java generics


【解决方案1】:

make-it-compile 方法是使用泛型声明变量,但使用原始类型初始化 数组(不是元素):

//add @SuppressWarnings("unchecked") to avoid warnings
Foo<String>[] arrayOfFoo = new Foo[8];
arrayOfFoo[0] = new ClassThatImplementsFoo<String>();
//line below gives a compile error since the array declaration is for Foo<String>
//and won't allow Foo<AnotherClass>
arrayOfFoo[1] = new ClassThatImplementsFoo<Integer>();

更好更安全的方法是使用List 而不是普通数组:

List<Foo<String>> fooList = new ArrayList<Foo<String>>();
fooList.add(new ClassThatImplementsFoo<String>());

在您的代码中,您应该这样做:

public class MyClass<E> {
    private final Foo<E>[] fooArray = new Foo[8];
    // (...)
}

【讨论】:

  • 原始类型方法本质上是不好的(你不应该使用原始类型)。列表方法更好。我不会将第一个标记为“正确”。
  • 我事先不知道类型。查看我的编辑!
  • @arshajii 遗憾的是,Java 没有提供另一种可编译的方式来初始化数组。注意数组中的元素不能初始化为ClassThatImplementsFoo&lt;Integer&gt;或者其他对象。
  • @chrisapotek 如果您使用泛型,该解决方案也适用。先试试吧。
  • @LuiggiMendoza 您的建议会发出警告(原始类型)。这正常吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
相关资源
最近更新 更多