当前位置: 首页 > 面试题库 >

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

巫马松
2023-03-14
问题内容

我刚刚了解了这种美观的语法

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-parameter,我将无法执行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


 类似资料:
  • 问题内容: 该问题的可接受答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数并从中调用方法。 然后创建的新实例,并传递参数。 如果新类的泛型类型参数不是某个已知类,但它本身是泛型类型参数,该怎么办?假设我还有其他班级,我想从该班级内部创建一个新实例。然后,如果尝试传递,则会收到以下编译器错误: 有没有办法解决? 对我来说触发错误的代码是: 发生错误,是因为我不会写。还有其他传递相同信息的方

  • 这个问题的公认答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数,并从中调用方法。 然后创建的新实例,并传入参数。 对我来说,触发错误的特定代码位是: 错误发生,因为我不能编写。还有其他方式传递同样的信息吗?

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 问题内容: 我有一个抽象类: 我需要充实的孩子-每个孩子都有自己的孩子 我只找到一种解决方案,但需要编译器参数 这是最好的解决方案吗?没有我们可以做同样的事情吗? 问题答案: 实现此目的的类型安全但很简单的方法是传递令牌“编译器可以看到它的位置”: 如果您执行的是未经检查的强制转换,但您“知道自己在做什么”,并且希望编译器停止抱怨,则正确的方法是将非类型安全但您知道它们的工作位本地化。使用: (我