Java通用成员初始化

问题描述:

假设我有一个包含私有T_member的参数化的Java类。我想写一个默认构造函数(无参数),以某种方式将我的T_member初始化为某个已知的类型T特定值(如-1表示整数,Float.MAX_VALUE表示浮点...)。那可能吗?我尝试了新的T(),但编译器不喜欢那样。或者我什么也不做,默认构造函数保证会被调用?Java通用成员初始化

Java中没有初始化表达式的每个字段都会自动初始化为已知的默认值。是的,在这种情况下,它是T型的已知值 - null

+0

哈好说+1 – 2012-08-04 02:13:11

这不是直接可能的,因为没有办法保证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. 
     } 
    } 
} 
+0

-1你不能用'T'做任何事情。这个答案完全不起作用。看到我的回答为什么 – Bohemian 2012-08-03 20:30:12

+0

OMG!你完全改变了你的答案,并复制粘贴它的顶部。你有没有荣誉? – Bohemian 2012-08-03 20:35:06

+0

我没有复制并粘贴你的答案。我添加了第二句和第三句的例子。我已经提出了你的答案;我的朋友,这里没有任何伤害。 – 2012-08-03 20:36:04

由于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”

问题上很常见的代码模式
+0

那个clazzy clazz有razz-matazz。 :D这是脱离主题,但我无法抗拒。 – Wug 2012-08-03 20:32:21

+3

你的意思是* type *擦除,我相信? (如果* runtime *擦除本身,会有点不好;-) – meriton 2012-08-03 20:36:14

+0

作为参数传递的Class实例被称为[类型标记](http://docs.oracle.com/javase/tutorial/extra/generics/ literals.html) – hertzsprung 2012-08-03 20:41:18

其实有一种方法来做到这一点,这里是一个链接到answer在相关的SO问题。

因此,实际上你的主要问题是否有的可能性在运行时获得通用成员类?是的,有 - 使用反思。

大约一年前,当我回过头来回答这个问题时,我测试了一下,并调查了一点反射。事实上,有些情况下,它不起作用(是继承的案件),但总的来说,这是不可能的。

但是,我强烈推荐不建议这样做。

编辑。令人惊讶的是,我在下面的答案中找到了自己的评论:)并且在下一个评论中,有作者对原始文章中关于泛型反射的链接。