Доступ к классу, реализующему универсальный абстрактный класс - PullRequest
0 голосов
/ 02 октября 2018

когда я пытаюсь создать экземпляр объекта, из класса, который расширяет общий абстрактный класс.Это не позволит мне, так как общий абстрактный класс не имеет подходящего конструктора.

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 не может быть применен к требуемым типам: Class

Так что, если я правильно понимаю, расширяя общий абстрактный класс, выне может создать экземпляр класса где-либо когда-либо?

Если я не могу получить доступ к классу Imp из других классов, как мне использовать этот класс?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Если вы хотите использовать конструктор без аргументов для инициализации класса Imp, то у AbstractClass также должен быть этот конструктор (без аргументов), но свойство entityClass больше не может быть окончательным в этом случае.

Это может привести к возможным исключениям нулевого указателя, если вы используете 'entityClass' без проверок NULL.

0 голосов
/ 02 октября 2018

вам нужно расширить его так:

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);
    }
}
...