在C#中,我可以对泛型参数设置类型约束,该参数要求泛型类型具有默认的无参数构造函数。我可以用Java做同样的事吗?
在C#中:
public static T SomeMethodThatDoesSomeStuff<T>() where T : class, new()
{
// ... method body ...
}
class和new()约束意味着T必须是可以使用零参数的new运算符调用的类。我对Java泛型知之甚少,我可以使用extends
来命名所需的超类。我可以使用它(或任何其他支持的操作)来实现上述功能吗?
答案 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);
(方法参考不必是构造函数。)