6

可能重复:
Java 泛型约束需要像 C# 这样的默认构造函数

我想为类型 T 设置一个约束,它必须有一个没有参数的构造函数。在 C# 中,它会像:

public interface Interface<T> where T : new() { }

这个功能在 Java 中可用吗?

更新:是否有一些技巧可以使泛型类型 T 具有构造函数?

4

4 回答 4

5

您不能在 Java 中为构造函数定义接口。除了类型差异之外,您也不能对类型参数施加任何其他约束。

于 2012-04-04T15:00:33.143 回答
1

回答您更新的问题:Java 中只有类可以有构造函数, T - 是类型文字,不一定必须是类。在运行时使用反射,您可以检查您的类是否为ParameterizedType是否有一个实际上是类的参数,以及它是否有一个空的构造函数。

于 2012-04-04T15:16:30.443 回答
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,那么您知道该类将没有默认构造函数,并且您可以抛出异常或任何适合您的应用程序的东西。

于 2012-04-04T15:08:09.740 回答
0

你可以让 T 用你想要的构造函数扩展一个类

public interface Interface<T extends Constructable>{}

public abstract class Constructable{
    public Constructable(params..){
     }
}
于 2012-04-04T15:16:06.330 回答