我想为类型 T 设置一个约束,它必须有一个没有参数的构造函数。在 C# 中,它会像:
public interface Interface<T> where T : new() { }
这个功能在 Java 中可用吗?
我想为类型 T 设置一个约束,它必须有一个没有参数的构造函数。在 C# 中,它会像:
public interface Interface<T> where T : new() { }
这个功能在 Java 中可用吗?
您不能在 Java 中为构造函数定义接口。除了类型差异之外,您也不能对类型参数施加任何其他约束。
回答您更新的问题:Java 中只有类可以有构造函数, T - 是类型文字,不一定必须是类。在运行时使用反射,您可以检查您的类是否为ParameterizedType是否有一个实际上是类的参数,以及它是否有一个空的构造函数。
您不能在 Java 的编译时执行此操作。我认为你能做的最好的就是尝试在运行时验证这一点,通过使用反射来做类似的事情:
public static <T> boolean hasDefaultConstructor(Class<T> cls) {
Constructor[] constructors = cls.getConstructors();
for (Constructor constructor : constructors) {
if (constructor.getParameterTypes().length == 0) {
return true;
}
}
return false;
}
然后,您可以通过执行以下操作来调用此函数:
hasDefaultConstructor(String.class) => true;
hasDefaultConstructor(Integer.class) => false;
如果此函数返回 false,那么您知道该类将没有默认构造函数,并且您可以抛出异常或任何适合您的应用程序的东西。
你可以让 T 用你想要的构造函数扩展一个类
public interface Interface<T extends Constructable>{}
public abstract class Constructable{
public Constructable(params..){
}
}