java中接口实现的约束

时间:2012-04-04 14:57:36

标签: java interface

  

可能重复:
  Java generics constraint require default constructor like C#

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

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

这个功能是否在Java中可用?

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

4 个答案:

答案 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..){
     }
}