如何将泛型与类数组一起使用?

2022-08-31 22:12:35

我想创建一个 Classes 数组,每个 Classes 表示我正在构建的系统中可用的类型。所有涉及的类都是公共超类的子类。所以我想做:

Class<? extends SuperClass>[] availableTypes = { SubClass1.class, SubClass2.class };

这给了我一个错误:

Cannot create a generic array of Class<? extends SuperClass>.

如果我尝试在初始化的右侧限定数组的创建,我会收到相同的消息:

Class<? extends SuperClass>[] availableTypes = Class<? extends SuperClass>[] { SubClass1.class, SubClass2.class };

如果我消除泛型限定,我可以让代码编译:

Class[] availableTypes = { SubClass1.class, SubClass2.class };

但后来我得到了泛型警告:

类是原始类型。对泛型类型类的引用应参数化。

我正在尝试;我在努力!:)此外,在这一点上,即使这没有引起警告,我也会丢失我试图定义的界面的一部分。我不想只返回任意类的数组;我想返回一个类数组,这些类都是特定超类的子类!

Eclipse 有一些非常强大的工具,可以找出使用哪些参数来修复泛型声明,但在这种情况下,它会下降,就像你处理 Class 时一样。它提供的“推断泛型类型参数”过程根本不会更改代码,而是留下警告。

我能够通过使用集合来解决此问题:

List<Class<? extends SuperClass>> availableTypes = new List<Class<? extends SuperClass>>();

但是,使用数组执行此操作的正确方法是什么?


答案 1

这似乎有点失败主义,但像这样的问题正是大多数人避免混合数组和泛型的原因。由于泛型的实现方式(类型擦除),数组和泛型永远不会很好地协同工作。

两种解决方法:

  • 坚持使用集合(例如),它的工作原理与数组一样好,并且还允许扩展。ArrayList<Class<? extends SuperClass>>
  • 在创建数组的代码上放置一个注释,并附上一个注释来证明其使用。@SuppressWarnings("unchecked")

答案 2

使用以下语法:

Class<? extends SuperClass>[] avail = new Class[] { SubClass1.class, ... };

它将为您提供“未选中”警告,这是正确的,因为您可能正在为数组中未扩展的类型包含一个对象。ClassSuperClass


推荐