Java通用成员初始化
假设我有一个包含私有T_member的参数化的Java类。我想写一个默认构造函数(无参数),以某种方式将我的T_member初始化为某个已知的类型T特定值(如-1表示整数,Float.MAX_VALUE表示浮点...)。那可能吗?我尝试了新的T(),但编译器不喜欢那样。或者我什么也不做,默认构造函数保证会被调用?Java通用成员初始化
Java中没有初始化表达式的每个字段都会自动初始化为已知的默认值。是的,在这种情况下,它是T型的已知值 - null
。
这不是直接可能的,因为没有办法保证T
,即使是也有的默认构造函数。然而,你可以想象用newInstance
的反射来做到这一点。只要确保捕捉到可能引发的任何异常。
public class MyClass<T> {
private T _member;
public MyClass(Class<T> cls) {
try {
_member = cls.newInstance();
} catch (InstantiationException e) {
// There is no valid no-args constructor.
}
}
}
由于type erasure,在运行时“没有T”。
围绕它的方式是到Class<T>
实例传入构造,像这样:
public class MyClass<T> {
T _member;
public MyClass(Class<T> clazz) {
_member = clazz.newInstance(); // catch or throw exceptions etc
}
}
顺便说一句,这是解决“做什么用T”
问题上很常见的代码模式那个clazzy clazz有razz-matazz。 :D这是脱离主题,但我无法抗拒。 – Wug 2012-08-03 20:32:21
你的意思是* type *擦除,我相信? (如果* runtime *擦除本身,会有点不好;-) – meriton 2012-08-03 20:36:14
作为参数传递的Class实例被称为[类型标记](http://docs.oracle.com/javase/tutorial/extra/generics/ literals.html) – hertzsprung 2012-08-03 20:41:18
其实有是一种方法来做到这一点,这里是一个链接到answer在相关的SO问题。
因此,实际上你的主要问题是否有的可能性在运行时获得通用成员类?是的,有 - 使用反思。
大约一年前,当我回过头来回答这个问题时,我测试了一下,并调查了一点反射。事实上,有些情况下,它不起作用(是继承的案件),但总的来说,这是不可能的。
但是,我强烈推荐不建议这样做。
编辑。令人惊讶的是,我在下面的答案中找到了自己的评论:)并且在下一个评论中,有作者对原始文章中关于泛型反射的链接。
哈好说+1 – 2012-08-04 02:13:11