Обобщенное параметризованное определение в интерфейсе и обоснование класса реализации

Я не могу понять концепцию реализации субтипирования / интерфейса по отношению к генерикам. Пожалуйста, объясни. У меня была следующая структура:

`ICommand -> ProducerConsumerCommand`

IProducerConsumer -> SimpleProducerConsumer

Насколько я понимаю, любой конкретный класс, реализующий IProducerConsumer, должен содержать объекты типа T, который является подклассом интерфейса Number и ICommand.

IProducerConsumer<T extends Number,ICommand>

Теперь я хочу написать класс реализации SimpleProducerConsumer,

Теперь я хочу сказать, что SimpleProducerConsumer может содержать параметры любого типа, как определено в параметрах типа IProducerConsumer, как показано ниже:

public class SimpleProducerConsumer<T,ICommand> implements Runnable,
        IProducerConsumer<T,ICommand> {

Это не работает, он говорит, как показано ниже:

SimpleProducerConsumer<T,ICommand> - ICommand complains (warning) that it is getting hidden.
IProducerConsumer<T,ICommand> - compiler errors in T saying as below

* Несоответствие границ: тип T не является допустимой заменой ограниченного параметра типа IProducerConsumer<T,ICommand>*

Итак, мой первый вопрос: почему я не могу определить так же, как интерфейс в конкретном классе. что происходит под капотами.

если я могу определить

 public class test<ICommand> {}

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

Теперь я определяю как ниже

public class SimpleProducerConsumer<T,ProducerConsumerCommand> implements Runnable,
        IProducerConsumer<T,ICommand> {

Еще T в IProducerConsumer жалуется.

Если я изменю, как показано ниже:

public class SimpleProducerConsumer<T,ProducerConsumerCommand> implements Runnable,
        IProducerConsumer<T extends Number,ICommand> {

распространяет жалобы на удаление токена.

Теперь я делаю так, как показано ниже:

public class SimpleProducerConsumer<T extends Number,ProducerConsumerCommand> implements Runnable,
        IProducerConsumer<T extends Number,ICommand> {

По-прежнему распространяется в IProducerConsumer не работает.

Сейчас

public class SimpleProducerConsumer<T extends Number,ProducerConsumerCommand> implements Runnable,
        IProducerConsumer<T,ICommand> {

Да, теперь компилятор счастлив. Теперь я полностью потерян, что значит выше всего. SimpleProducerConsumer содержит объекты типа T, которые являются подклассом Number, и объект ProducerCommand имеет смысл, но IProducerConsumer содержит объекты типа T??? что это?

В чем причина этого. Может кто-нибудь, пожалуйста, expalin.

1 ответ

Решение

У вас есть две проблемы здесь:

  1. Как сейчас заявлено в IProducerConsumer<T extends Number,ICommand>, ICommand не ссылается на ваш ICommand интерфейс, но вместо этого это просто еще одно объявление параметра общего типа, как T, Поэтому вы получаете предупреждение, что этот параметр общего типа скрывает ваш ICommand интерфейс. Вы должны объявить свой IProducerConsumer вот так:

    public interface IProducerConsumer<N extends Number, C extends ICommand>
    
  2. Вы получаете Bound mismatch за T, так как T не обязательно распространяется Numberв соответствии с требованиями IProducerConsumer интерфейс. Чтобы это исправить, вы должны объявить SimpleProducerConsumer вот так:

    public class SimpleProducerConsumer<N extends Number, C extends ICommand> implements Runnable, IProducerConsumer<N,C>
    
Другие вопросы по тегам