这是一种创建实例的安全方法(假设T有一个可访问的默认构造函数)?
<T>
public T defaultObj(T obj) throws Exception {
return (T) obj.getClass().newInstance();
}
由于类型擦除,上述代码将生成未经检查的警告。是否可以除了@SuppressWarnings之外摆脱这个警告?
非常感谢提前!
修改
是的,我知道如果我能通过一个更好的class<T> type
。但是,让我们假设它现在是不可能的。
答案 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
绝对合法,您不应该试图避免使用它。