0

我有 2 节课:

public class Super {

    public static <T> T bar(Class<T> clazz){

        try {
            return (T)(clazz.newInstance());
        } catch (IllegalAccessException e) {           
            e.printStackTrace();
        } catch (InstantiationException e) {           
            e.printStackTrace();
        }
        return null;
    }
}

public class Sub extends Super{

    public static void main(String[] args){
        Sub s = Sub.bar(Sub.class);

    }
}

现在我不想Class<T> clazz用作参数bar,所以我怎样才能返回泛型类型T,谢谢。

4

2 回答 2

2

你不能。泛型仅在编译时可用,在运行时不可用。因此,您必须提供才能Class clazz在运行时知道 T 。

于 2012-07-04T08:41:22.653 回答
1

提供 Class 实例来创建新对象并没有错。

如果您的代码需要创建对象或通常对某个类进行操作,则应传递实例。此操作与其他对象用法没有区别。泛型应该使事情变得更容易并确保类型安全。所以在这种情况下,可以通过对泛型参数设置一些限制,通过 bar 静态方法创建女巫类的限制。

顺便提一句。

您应该从实现 的类中调用静态方法,而不是Sub.bar(Sub.class)应该拥有Super.bar(Sub.class).

于 2012-07-04T08:50:25.130 回答