我有一个抽象类:
public abstract class RootProcessor<T> {
Class<T> clazz;
}
我需要充实ClassT clazz;
的孩子RootProcessor
-每个孩子都有自己的孩子T
我只找到一种解决方案,但需要编译器参数 -Xlint:unchecked
public RootProcessor(){
this.clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
这是最好的解决方案吗?没有我们可以做同样的事情-Xlint:unchecked
吗?
实现此目的的类型安全但很简单的方法是传递Class<T>
令牌“编译器可以看到它的位置”:
public abstract class RootProcessor<T> {
Class<T> clazz;
protected RootProcessor<T>(Class<T> clazz) {
this.clazz = clazz;
}
}
public class FooProcessor extends RootProcessor<Foo> {
public FooProcessor() {
super(Foo.class);
}
}
如果您执行的是未经检查的强制转换,但您“知道自己在做什么”,并且希望编译器停止抱怨,则正确的方法是将非类型安全但您知道它们的工作位本地化。使用@SuppressWarnings
:
public abstract class RootProcessor<T> {
Class<T> clazz;
{ initClazz(); }
@SuppressWarnings("unchecked")
private void initClazz() {
// the usual verbiage you already have in your question
this.clazz = this.getClass().getGenericSuperclass().yadda().blah();
}
}
(我不会反对你:P)
我有一个类
如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或
问题内容: 我有一个列表,程序是这样的:。有什么方法可以使用T变量获取类的名称(因此我可以从内部知道T是否为String,Socket等)? 编辑:没关系,在这里找到了答案。 问题答案: 简短答案 :您不能。 长答案 : 由于使用Java实现泛型的方式,泛型T在运行时不会保留。您仍然可以使用私有数据成员: 用法示例:
问题内容: 我在使用泛型时遇到麻烦。给出以下示例: 什么 ???应该 ? 不工作… 也不。 不工作… 如果有Java泛型专家,我需要帮助…:/ 问题答案: 由于类型擦除,您可能无法获得除外。你将不得不使用不安全的类型转换投下的-具体而言,将做的工作。
问题内容: 我正在刷新有关Java泛型的知识。因此,我转向了Oracle的优秀教程……并开始为我的同事编写一个演示文稿。我在本教程中遇到了有关通配符的部分,内容为: 考虑以下方法,printList: printList的目标是打印任何类型的列表,但未能实现该目标- 它仅打印Object实例的列表;它不能打印,,,等等,因为它们不是的亚型。要编写通用的printList方法,请使用: 我知道那是行
我正在刷新我关于Java泛型的知识。所以我转向甲骨文的优秀教程...并开始为我的同事准备一个演示文稿。我在教程中遇到了通配符部分,上面写着: 考虑以下方法,打印列表: printList的目标是打印任何类型的列表,但它无法实现该目标-它只打印对象实例的列表;无法打印列表 我明白那个