【问题标题】:Pass generic type parameter class as argument将泛型类型参数类作为参数传递
【发布时间】:2015-12-09 03:26:42
【问题描述】:

假设我有一个方法

public <T extends Enum<T>> Enum<T> getEnumValue(String string, ??)

还有一个方法,在不同的类中,

public T method(String string)
  ...
  getEnumValue(string, ??)

我会从方法 2 中将什么作为参数传递给方法 1,以便我可以获得枚举值,即在我的幻想世界中我可以这样做:

方法二:

getEnumValue(string, T.class)

方法一:

getEnumValue(String string, Class<T> clazz)
  return Enum.valueOf(clazz, string)

【问题讨论】:

  • 由于类型擦除,无法执行此操作。 没办法。没有办法绕过显式的Class&lt;T&gt;
  • 你可以传入你想要使用的类/枚举全名的字符串信息,然后你想要获取的值。然后解析此字符串以获取类型名称,使用 Class.forName 就是这样。但这不包括泛型,因为我们正在将选择 Class 的决定转移到运行时。

标签: java generics reflection enums


【解决方案1】:

由于类型擦除,无法执行此操作。您必须传递明确的Class&lt;T&gt;,或足够的信息来恢复它(例如,您可以传递给Class.forNameString 名称,或T 的实例)。

【讨论】:

  • 如何获取类型参数对象的类名?示例:如果函数是 ``` public void convert(final T arg) { } ``` 我如何将 arg 作为 Class 传递给其他方法?
  • 我不确定你的意思?你可以调用arg.getClass(),但这可能是T的一个子类型。没有办法得到确切的类T。或者你的意思是制作方法&lt;T extends Base&gt; convert(T arg, Class&lt;T&gt; clazz)
【解决方案2】:

EnumClass.getEnumConstants()

它在java.lang.Class 而不是java.lang.Enum。使用你的 EnumClass.VALUE.cardinal() 来索引这个数组。

如果你坚持叫String名字,你可以这样做

EnumClass.getEnumConstants()[0].valueOf(stringValue)

这是在实例上调用静态方法,您可能会收到编译器警告,但它可以工作。

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多