Java Generics - Параметр типа `K` находится за его пределами; должен реализовать X - PullRequest
5 голосов
/ 16 мая 2019

Я читаю Java-документы по дженерикам, в частности эта страница по ограниченным типам, и я потерян.Вот простая версия моего кода, для контекста я обычно хочу сопоставимый ключ, один с Integer и другой абстрактный класс с Date, вот только базовый абстрактный класс и целочисленная реализация:

Абстрактный класс:

public abstract class A<K extends Comparable<K>, V> extends TreeMap<K, V>

Целочисленный абстрактный класс:

public abstract class B<K extends Integer, V> extends A<K,V>

Я получаю ошибку в ссылке на типвторого класса на части extends A<K,V>.В частности, моя IDE лежит в основе K и говорит: Type parameter 'K' is not within its bound; should implement 'java.lang.Comparable<K>'

Я запутался в этом, потому что в определении Integer он реализует Comparable<Integer>, разве этого недостаточно, чтобы удовлетворить это?Более того, когда я пытаюсь сделать следующее, public abstract class B<K extends Integer & Comparable<K>, V> extends A<K,V>, это тоже не работает.

Неужели я что-то не так понимаю с дженериками?

Ответы [ 2 ]

4 голосов
/ 16 мая 2019

Поскольку Integer является окончательным классом, правильное определение B будет следующим:

public abstract class B<V> extends A<Integer,V> {

}

Вам не нужен параметр типа K.

2 голосов
/ 16 мая 2019

Ошибка компилятора возникает из-за того, что Date реализует Comparable<Date>, подкласс Date может не реализовывать Comparable<SubclassOfDate>, поэтому компилятор жалуется.

Это можно исправить, изменив Aобъявление об использовании подстановочного знака:

public abstract class A<K extends Comparable<? super K>, V> extends TreeMap<K, V>

Однако вы, вероятно, намеревались объявить B следующим образом:

public abstract class B<V> extends A<Integer,V> {

}

Integer - это final, никакого другого классаможет унаследовать это.Так что B не обязательно должен быть универсальным для K.

Что касается класса с Date в качестве ключа, вы, вероятно, также захотите сделать это так:

public abstract class C<V> extends A<Date,V> {

}

Но поскольку Date не является final, вы могли бы сделать универсальный параметр K extends Date:

public abstract class C<K extends Date, V> extends A<K,V> {

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