从对象创建实例的通用方法

时间:2011-11-03 14:26:38

标签: java

这是一种创建实例的安全方法(假设T有一个可访问的默认构造函数)?

<T>
public T defaultObj(T obj) throws Exception {
    return (T) obj.getClass().newInstance();
}

由于类型擦除,上述代码将生成未经检查的警告。是否可以除了@SuppressWarnings之外摆脱这个警告?

非常感谢提前!

修改 是的,我知道如果我能通过一个更好的class<T> type。但是,让我们假设它现在是不可能的。

3 个答案:

答案 0 :(得分:3)

您可以将签名稍微更改为<T> T defaultObj(Class<T> obj),然后newInstance()将返回相应的对象。

答案 1 :(得分:1)

  

除了@SuppressWarnings之外,是否可以摆脱此警告?

您可以约束T扩展一些提供工厂方法的界面。

interface Newable<T>
{
    T getNewInstance();
}

<T extends Newable<T>> T defaultObj(T obj)
{
    return obj.getNewInstance();
}

示例实现:

class Foo implements Newable<Foo>
{
    @Override
    public Foo getNewInstance() {
        return new Foo();
    }
}

答案 2 :(得分:1)

这正是@SuppressWarnings应该做的:这段代码是安全的(因为在getClass()类型的对象上调用T实际上会产生Class<? extends T>),但是编译器不能理解它(由于泛型的限制,getClass()的返回值被声明为Class<?>)并产生警告。

在这种情况下使用@SuppressWarnings绝对合法,您不应该试图避免使用它。