访问实现通用抽象类的类

时间:2018-10-02 19:01:19

标签: java generics abstract

当我尝试从扩展通用抽象类的类实例化对象时。因为通用抽象类没有合适的构造函数,所以它不会让我失望。

public abstract class AbstractClass<T> {

    private final Class<T> entityClass;

    public AbstractClass(Class<T> entityClass) {
        this.entityClass = entityClass;
    }    
}

这是我正在谈论的通用抽象类。

public class Imp extends AbstractClass {

    public Imp(Class entityClass) {
        super(entityClass);
    }

}

如果我想访问Imp类,那么我将尝试通过普通的构造函数实例化它。但是尝试时出现以下错误:

public class Imp extends AbstractClass {

    public Imp(){

    }

    public Imp(Class entityClass) {
        super(entityClass);
    }

}

类AbstractClass中的构造方法AbstractClass无法应用于所需的给定类型:类

因此,如果我理解正确,那么通过扩展泛型抽象类,您将无法在任何地方实例化该类?

如果无法从其他类访问Imp类,我应该如何使用该类?

2 个答案:

答案 0 :(得分:3)

您需要像这样扩展它:

public class Imp<T> extends AbstractClass<T> {

    public Imp() {
        super(null); // you need to call an existing constructor from superclass (nothing specific about generic classes)
    }

    public Imp(Class<T> entityClass) {
        super(entityClass);
    }
}

切勿使用没有通用参数的通用类。

只是猜测,但也许您实际上想要这样的东西:

public class IntegerImpl extends AbstractClass<Integer> {

    public IntegerImpl () {
        super(Integer.class);
    }
}

答案 1 :(得分:1)

如果要使用无参数构造函数初始化Imp类,则AbstractClass也应具有此(无参数)构造函数,但是在这种情况下,'entityClass'属性不再是final。

如果您使用'entityClass'而不进行非空检查,则可能导致空指针异常。