可能重复:
Java generics constraint require default constructor like C#
我想设置一个约束类型T,它必须有一个没有参数的构造函数。在C#中它将是:
public interface Interface<T> where T : new() { }
这个功能是否在Java中可用?
答案 0 :(得分:5)
您无法在Java中为构造函数定义接口。除了类型方差之外,你也不能将任何其他约束放在类型参数上。
答案 1 :(得分:1)
回答你的更新问题:只有类可以在Java中有一个构造函数,T - 是一个类型文字,它不一定是一个类。在使用反射的运行时期间,您可以检查您的类是否为ParameterizedType,其参数实际上是一个类,并且它是否具有空构造函数。
答案 2 :(得分:0)
您无法在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,那么您知道该类没有默认构造函数,您可以抛出异常或适合您的应用程序的任何内容。
答案 3 :(得分:0)
你可以使用你想要的构造函数来扩展一个类
public interface Interface<T extends Constructable>{}
public abstract class Constructable{
public Constructable(params..){
}
}