Хобрук: Ваш путь к мастерству в программировании

Может ли параметр универсального типа Java расширять другой параметр типа и дополнительный ограниченный тип?

Я создаю общий класс (TestGeneric) с двумя параметрами типа (TAnimal и TMammal), причем параметр 2-го типа (TMammal) расширяет параметр 1-го типа (TAnimal) и другой тип (Mammal).

public class TestGeneric<TAnimal extends Animal, TMammal extends TAnimal & Mammal> { .. }

куда

public interface Animal { ... }

public class Mammal implements Animal { ... }

У меня проблема с Java:

Невозможно указать дополнительную привязку Mammal, если первая привязка является параметром типа.

Если я поменяю местами ограниченный тип TAnimal и Mammal,

public class TestGeneric<TAnimal extends Animal, TMammal extends Mammal & TAnimal> { .. }

У меня другая проблема с Java:

Тип TAnimal не является интерфейсом; он не может быть указан как ограниченный параметр.

Есть ли способ преодолеть вышеупомянутое ограничение в Java?

Я использую Java 1.8-172.


Ответы:


1

Вы не можете использовать несколько границ, если одна из границ является параметром типа.

Кроме того, при использовании нескольких границ первая может быть классом или интерфейсом, а остальные могут быть только интерфейсами. Это связано с тем, что Java не поддерживает множественное наследование, поэтому перечисление нескольких классов аналогично перечислению только самого дальнего подкласса.

Чтобы он заработал, вам нужно написать такой код:

public class TestGeneric<TAnimal extends Animal, TMammal extend Mammal & Animal> { }

Или потому, что Mammal все равно реализует интерфейс Animal:

public class TestGeneric<TAnimal extends Animal, TMammal extends Mammal> { }
03.11.2018
  • Спасибо. В настоящее время я использую второй подход, поскольку Mammal в любом случае реализует Animal. 03.11.2018
  • Новые материалы

    Управление DOM для чайников вроде меня
    Одной из первых вещей, которую мы рассмотрели, когда начали изучать Javascript во Flatiron, была модель DOM. Кто он? Чем он занимается? Он больше машина, чем человек? Ну да довольно много. ДОМ..

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

    Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
    На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..