Что означает, что не общий класс расширяет общий класс

public class B extends C <A> {

}

Что это значит? Что C должен расширить A? Какое дополнительное ограничение я ставил вместо того, чтобы просто говорить, что B расширяет C?

Ответ 1

В этом случае C - это класс, который может принимать общий параметр, и вы указываете в качестве параметра определенный тип A. Затем B расширяет эту специфическую параметризацию C.

Например, предположим:

class C<T> {
    T example();
}

class B extends C<Integer> {
}

Тогда B.example() вернет Integer.

Ответ 2

Вы определяете класс B, который наследует от класса C, параметризованного с типом A. A должен быть классом или интерфейсом.

например.

class MyStringList extends ArrayList<String>

означает, что MyString IS AN ArrayList, который будет содержать только элементы String. Этот класс затем может определить, например. a concatenate(), который возвращает конкатенацию всех Strings в списке.

Из-за этого наследования вы сможете назначить экземпляр переменной List<String>:

List<String> strings = new MyStringList();

Но вы не сможете присвоить ему переменные типа List с другими параметрами:

List<Object> objects = new MyStringList(); // does not compile

Ответ 3

C<A> не означает, что C расширяется A, это означает, что он может иметь A как параметр типа.

Это очень похоже на интерфейсы Comparable<T> и Comparator<T> в java.

Рассмотрим следующий пример

public class NameSort implements Comparator<Employee> {
   public int compare(Employee one, Employee another){
       return (int)(one.getName() - another.getName());
   }
}

означает, что Компаратор использует объекты Employee для их сортировки с использованием своего имени.

Вы также можете взять еще один пример

   List<String> list = new ArrayList<String>();

Эта строка означает, что List использует String объекты в качестве параметров

Ответ 4

Класс B является C.

C и B параметризуются с помощью A. (Это означает, что у них могут быть методы и методы, которые используют методы A или методы классов, которые происходят от A.)

Классический вариант использования для этого будет заключаться в том, что у вас есть DAO (объект доступа к данным). Вы создаете общий DAO с некоторыми базовыми методами, например GenericDAO с общим методом save. Чтобы сделать это, другие DAO могут расширять GenericDAO, вы параметризуете этот класс с помощью Entity, и убедитесь, что все ваши Entity можно сохранить.

Тогда у вас есть GenericDAO<Entity и множество реализаций этого, например UserDAO extends GenericDAO<User>, где Пользователь является сущностью.

Ответ 5

Простыми словами

Это ничего не значит, если только методы, определенные в Class C или его потомках, для accept или return Тип A.

Таким образом, вы обеспечиваете безопасность типа, накладывая ограничения на "Они могут принимать или возвращать объекты типа A".

Ответ 6

public class B extends C <A> {

}
  • Если A есть undefined, на B нет ограничений (может быть любой класс объектов).
  • Если тип A определен, то B должен быть типа A или подкласса A.