java - 从 Java 中的枚举属性获取泛型类的实例

标签 java generics casting enums

我的类中有一个枚举,其中包含一个 Class 属性,如下所示:

public enum DatEnum {
  CONSTANT_ONE(ClassOne),
  CONSTANT_TWO(ClassTwo);

  private Class<? extends UpperBoundClass> classAttribute;

  private DatEnum(Class<? extends UpperBoundClass> classAttribute) {
    this.classAttribute = classAttribute;
  }

  public <T extends UpperBoundClass> T getInstance() {
    UpperBoundClass instance = classAttribute.newInstance();
    return instance;
  }
}

但是随后我在 getter 的第一行收到警告:

Unchecked cast from capture#4-of ? extends UpperBoundClass to T

也在 getter 的第二行中:

Unchecked cast from UpperBoundClass to T

到目前为止,代码可以工作,但我真的很想摆脱警告,并更好地理解问题的实际所在。

最佳答案

public <T extends UpperBoundClass> T getInstance() {
  UpperBoundClass instance = classAttribute.newInstance();
  return instance;
}

这段代码实际上没有返回 <T> 。它返回特定 Class<? extends UpperBoundClass> 的实例由 classAttribute 引用 field 。编译器可以验证的只是 instance可分配给(能够转换为)UpperBoundClass 。但是,该实例与 <T> 表示的特定类型之间没有声明的关系。在方法签名中。

最终结果:您将收到警告。只要您使用的每个地方它都可能碰巧 CONSTANT_ONECONSTANT_TWO已经期望与您在各自的构造函数中放入的类型相同,但编译器无法强制执行或知道这一点。

如果将方法更改为以下内容,那么您将看到使用站点(在调用代码中)不是严格类型安全的,因为它们假定特定的子类:

public UpperBoundClass getInstance() {
  return classAttribute.newInstance();
}

或者,您可以提供 <T> 之间的一些关系和存储的类引用:

public <T extends UpperBoundClass> T getInstance(Class<T> type) {
  UpperBoundClass instance = classAttribute.newInstance();
  return type.cast(instance); // verifies type-safety
}

但是这样做没有什么意义,因为调用者可以调用 type.newInstance()本身或只是 new ClassOne() (取决于用例)。调用type.cast(instance)可能会抛出ClassCastException在运行时,但编译器会很高兴,因为它认为这是你当时的问题。

您正在对抗一个 enum 的事实出具统一契约(Contract);虽然您可以使用多态行为自定义各个常量,但不能使用泛型来参数化 enum基本 API,其内容因实例而异。

相关阅读:Why shouldn't Java enum literals be able to have generic type parameters?

关于java - 从 Java 中的枚举属性获取泛型类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26068698/

相关文章:

c++ - 如何将其他类型的默认参数传递给参数?

c# - 调用通用反射方法时对象引用未设置为对象的实例

java - 什么是原始类型,为什么我们不应该使用它呢?

java - Android 多个 parcelable 构造函数

java - 在静态创建者方法后面隐藏构造函数?

Java 类型转换问题

android - kotlin 绑定(bind)类引用和泛型

objective-c - iOS - 努力在 Obj-C/Swift 代码之间转换

java - 找到元素并打印大量的一部分

java - 为什么binarySearch方法没有返回正确的结果?