繁体   English   中英

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

[英]generic method to create an instance from an object

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

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

由于类型擦除,以上代码将生成未经检查的警告。 除@SuppressWarnings之外,是否可以消除此警告?

提前谢谢了!

编辑:是的,我知道是否可以传递class<T> type ,这会更好。 但是,让我们假设暂时没有问题。

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

除@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();
    }
}

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

在这种情况下使用@SuppressWarnings是绝对合法的,并且您不应该避免使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM