Java泛型约束需要像C#这样的默认构造函数

时间:2011-09-27 02:45:10

标签: java generics

在C#中,我可以对泛型参数设置类型约束,该参数要求泛型类型具有默认的无参数构造函数。我可以用Java做同样的事吗?

在C#中:

    public static T SomeMethodThatDoesSomeStuff<T>() where T : class, new()
    {
            // ... method body ...
    }

class和new()约束意味着T必须是可以使用零参数的new运算符调用的类。我对Java泛型知之甚少,我可以使用extends来命名所需的超类。我可以使用它(或任何其他支持的操作)来实现上述功能吗?

3 个答案:

答案 0 :(得分:8)

没有;在Java中,典型的解决方案是传递一个类,而 doc 是0-arg构造函数的要求。这肯定不是静态检查,但不是太大的问题

/** clazz must have a public default constructor */
public static <T> T f(Class<T> clazz)
    return clazz.newInstance();

答案 1 :(得分:3)

没有

由于类型擦除,<T>的类型在运行时是未知的,因此实际上不可能实例化它。

答案 2 :(得分:0)

Java不执行结构化类型化,因此您不能约束T来使用特定的构造函数或static方法。仅允许子类型和超级类型限制。

因此,请通过适当的抽象工厂。在这里,或者几乎在任何情况下,使用反射都是非常不合适的。现在,以java.util.function.Supplier的形式提供了一种合适的通用JDK类型。

public static T someMethodThatDoesSomeStuff<T>(
    Supplier<T> factory
) {

以以下身份调用:

驴驴= someMethodThatDoesSomeStuff(BigDonkey :: new);

(方法参考不必是构造函数。)