Обобщенное параметризованное определение в интерфейсе и обоснование класса реализации
Я не могу понять концепцию реализации субтипирования / интерфейса по отношению к генерикам. Пожалуйста, объясни. У меня была следующая структура:
`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 ответ
У вас есть две проблемы здесь:
Как сейчас заявлено в
IProducerConsumer<T extends Number,ICommand>
,ICommand
не ссылается на вашICommand
интерфейс, но вместо этого это просто еще одно объявление параметра общего типа, какT
, Поэтому вы получаете предупреждение, что этот параметр общего типа скрывает вашICommand
интерфейс. Вы должны объявить свойIProducerConsumer
вот так:public interface IProducerConsumer<N extends Number, C extends ICommand>
Вы получаете
Bound mismatch
заT
, так какT
не обязательно распространяетсяNumber
в соответствии с требованиямиIProducerConsumer
интерфейс. Чтобы это исправить, вы должны объявитьSimpleProducerConsumer
вот так:public class SimpleProducerConsumer<N extends Number, C extends ICommand> implements Runnable, IProducerConsumer<N,C>