Подстановочный класс как переменная в конструкторе - PullRequest
0 голосов
/ 07 января 2019

У меня есть класс A

class A{}

класс А1 расширяет класс А

class A1 extends A{}

Теперь в классе B я хочу передать любой класс, который расширяет класс A. как переменную.

class B{
    Class<? extends A> variable;

    public B(Class<? extends A> variable) {
        this.variable = variable;
    }
}

для запуска выше, класс драйвера как ниже

 class C {
    public static void main(String args[]) {
        B b=new B(new A());// A cannot be converted to Class<? extends A>.
        B b=new B(new A1());// A1 cannot be converted to Class<? extends A>.
            }
}

потому что Class<? extends A> variable это означает, что любой класс, расширяющий класс A, может быть передан в конструктор, а A1 расширяет A, тогда почему он дает ошибку?

что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Я подозреваю, что на самом деле вы пытаетесь настроить B, чтобы он мог работать с экземплярами из A или любым подтипом A. Для этого вам нужно сделать сам класс B родовым:

class B<T extends A> {
    T variable;

    public B(T variable) {
        this.variable = variable;
    }
}

class C {
    public static void main(String args[]) {
        B<A> b = new B<>(new A());
        B<A1> b1 = new B<>(new A1());
    }
}
0 голосов
/ 07 января 2019

Class<? extends A> variable означает, что variable может содержать ссылку на объект типа Class, а не на что-то, расширяющее A.

Class - это «метакласс», его цель - описать другой класс. Из экземпляра Class вы можете получить все поля и все методы, которые предоставляет этот класс. Вы можете взглянуть на учебник Java отражение для получения дополнительной информации.

Чтобы ваш код работал, вы можете написать что-то вроде этого:

class B<T extends A> {
    private T variable;
    public B(T variable) {
        this.variable = variable;
    }
}

class C {
    public static void main(String args[]) {
        B<A> b = new B<>(new A());
        B<A1> b1 = new B<>(new A1());
    }
}

Таким образом, вы создаете универсальный класс B, который принимает экземпляры A или что-то, что расширяет A

0 голосов
/ 07 января 2019

Что будет работать вместо:

B b = new B(A.class); // class type expected and not the instance of

или

B b = new B(A1.class);

Для дальнейшего пояснения параметр Class<? extends A> variable означает, что <? extends A> является типом класса, моделируемого предоставленным объектом Class. Следовательно, вам нужно предоставить либо класс A, либо любой класс, расширяющий A, в качестве аргумента, но типа Class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...