java - 没有参数时如何获取泛型类?

标签 java generics

我刚知道这个fine looking syntax

Collections.<String>emptyList()

获取一个空的 List,其中的元素应该是 String 类型。 Java 的源代码如下所示:

public static final List EMPTY_LIST = new EmptyList<Object>();
:
public static final <T> List<T> emptyList() {
  return (List<T>) EMPTY_LIST;
}

现在,如果我以通用类型不出现在参数列表中的方式编写方法,有什么方法可以访问变为 T 的实际类?

我是说,到目前为止,我编写相同内容的方法是

private <T> T get(String key, Class<T> clazz) {
  // here I can do whatever I want with clazz, e.g.:
  return clazz.cast(value);
}

如果我删除了 clazz 参数,我将无法执行 cast()。显然我可以做到

  return (T) value;

但这给了我通常的警告 Type safety: Unchecked cast from Object to T。好的,@SuppressWarnings("unchecked") 在这里有所帮助,但实际上我想对方法的预期返回类型做一些事情。如果我添加一个局部变量

T retValue;

我必须用一些东西来初始化它,null 没有帮助。在我分配它之后

@SuppressWarnings("unchecked")
T retValue = (T) value;

我可以做,例如

retValue.getClass().getName()

但如果转换失败,我将再次没有关于 T 的信息。

由于 Java(或至少我的 Java 6)在运行时不再有通用信息,我目前想不出办法来做到这一点。有办法吗?还是我必须在这里坚持我的“旧”方法?

请注意,我列出的示例非常简单,没有多大意义。我想在这里做更复杂的事情,但这超出了范围。

最佳答案

如果您想要在运行时使用泛型类型,您需要将其作为字段或为特定类型组合创建类型的子类。

例如

List<String> list = new ArrayList<String>() {}; // creates a generic sub-type
final Class type = (Class) ((ParameterizedType) list.getClass()
                            .getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(type);

打印

class java.lang.String

关于java - 没有参数时如何获取泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8436055/

相关文章:

java - 我需要使用 double 而不是 int 来使我的结果正确。为什么? ( java )

Java:声明带有多个泛型 "constraints"的变量

c - 用通用参数包装算法的最安全和最易读的方法?

java - 使用泛型链接任务

java - neo4j 中的随机后序遍历

java - 在 JScrollPane 上停用 ScrollOnExpand

java - Java3D/OpenGL 角点网格的内存高效实现

java - 当我们将参数传递给方法时会发生什么操作?

java - 关于 PECS java 泛型

c# - 当基类是泛型时在 XAML 中设置依赖属性