我有一个参数化的类:
class ParameterizedClass<T extends AbstractSomething> {
}
致电:
new ParameterizedClass<Something>();
那么,如何T
使用Java泛型来获取实际的类型?
可以做到,但是类型擦除可能会很困难。正如其他答案所讨论的那样,您必须成为的子类ParameterizedClass
或将类型的字段添加T
到中ParameterizedClass
,而执行此操作所需的反射代码却很复杂。
在这种情况下,我建议您解决以下问题:
class ParameterizedClass<T> {
private Class<T> type;
/** Factory method */
public static <T> ParameterizedClass<T> of(Class<T> type) {
return new ParameterizedClass<T>(type);
}
/** Private constructor; use the factory method instead */
private ParameterizedClass(Class<T> type) {
this.type = type;
}
// Do something useful with type
}
由于Java对静态方法的类型推断,因此无需太多额外的样板即可构造类:
ParameterizedClass<Something> foo = ParameterizedClass.of(Something.class);
这样,您就ParameterizedClass
具有完全的通用性和类型安全性,并且仍然可以访问类对象。
编辑 :解决了评论
问题内容: 我有一个像这样的课程: 但是编译器说:。 我如何获得的课程? 问题答案: 绝对有可能将其提取出来,因为它不是在运行时定义的,而是在编译时由定义的。 这是一个启动示例,您可以如何在抽象类的构造函数中提取所需的泛型超类型,同时考虑子类的层次结构(以及在无需显式提供类型的情况下将其应用于泛型方法的实际用例)):
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
TypeParameterResolver是mybaits中定义的一个用于解析泛型实际类型的工具类。 在java中定义了一个名为Type的接口,他是java编程语言中所有类型的公共接口,这里的类型包括了原始类型、参数化类型、数组类型、类型变量和基本类型。 简单了解一下Type相关的接口 我们可以通过下面这个类定义简单的了解一下不同类型的区别: /** * 一个简单的泛型对象的定义 * {@
问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问
问题内容: 我刚刚了解了这种美观的语法 用可能是类型的元素来清空。Java的源代码如下所示: 现在,如果我以这种方式编写了一个泛型类型不出现在参数列表中的方法,那么有什么方法可以访问成为的实际类呢? 我的意思是,到目前为止,我编码同一件事的方法是 如果删除了-parameter,我将无法执行。显然我可以 但这给了我通常的警告。好的,在这里有帮助,但是实际上我想对方法的预期返回类型做些事情。如果我添
我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数A必须扩展参数B,其中A和B都是泛型的。 下面是我的示例 用法示例如下 一些封闭的班级 和函数调用 我不想在抽象类声明中定义E,因为T已经在那里定义了。 我也试着做了以下几点: 将myList定义为接受扩展T的键 将E定义为T类型(无法找到如何指定它在函数中扩展T 但它从来都不起作用。有没有办法做到这一点?我在Sta