Как правильно реализовать универсальный интерфейс в Java - PullRequest
3 голосов
/ 07 мая 2019

Я прошу прощения, если это произойдет, когда кто-то просто повернется к переполнению стека или это звучит слишком просто. Я застрял на этой проблеме весь день, и все ресурсы, которые я пробовал (Google, переполнение стека, друзья и книги по Oracle, оказались бесполезными.

Итак, мне дали следующий раздел кода, над которым я должен работать.

import org.Plugin

public interface Product<T extends Data>{
   void Customer(Plugin<T> plugin);
}

Мне удалось разбить базу того, что делает этот код, относительно класса Product, я знаю, что:
- T расширяет данные: параметр ограниченного типа для T, T должен быть подклассом данных
- Мне нужно создать класс, который реализует класс Product вместе с методом Customer.

Пока я придумал это:

class TheProduct implements Product{
   @Override
   public void Customer(Plugin plugin){
   }
}

Что меня смущает, так это то, что делает (Plugin<T> plugin) часть метода Consumer. Плагин ссылается на параметр, такой как переменная? Если да, нужно ли включать его в класс TheProduct?

Мне кажется, что я что-то упускаю, но понятия не имею, что.

Спасибо всем, кто нашел время, чтобы прочитать :)

Ответы [ 2 ]

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

Оба Plugin<T> и Product<T> являются примерами универсальных типов.Тот факт, что вы использовали параметр T в обоих местах, означает, что вы ожидаете, что они оба получат один и тот же универсальный тип.

Например, если вы указали string в качестве типа для T (хотя это не будет соответствовать вашему ограничению данных), ваш метод customer будет ожидать получения экземпляра Plugin<string>.

В вашем случае у вас также есть ограничение на T, что ондолжен быть некоторого типа, который реализует Data, но применяется та же логика: T является заполнителем для вашего универсального типа.

Имя T является произвольным.Для типов, которые ожидают один универсальный параметр, принято называть его T, но вы можете использовать что-то более описательное, если это поможет.

1 голос
/ 07 мая 2019

Параметр ограниченного типа для T, T должен быть подклассом Data

или Data.

Что делает (Plugin<T> plugin) часть метода Consumer?

Ожидается обобщенный Plugin<T>, а не raw Plugin.Примером Plugin<T> может быть Plugin<Data> или Plugin<SubData>, где SubData является подклассом Data.

Относится ли Plugin к параметру, такому как переменная?

Plugin не может ссылаться.Вы можете.В определении Customer вы ссылаетесь на параметр типа T, определенный в Product<T extends Data>.

Если да, нужно ли включать его в класс TheProduct?

Да, вы делаете.У вас есть один тип параметра T, который обобщает интерфейс Product.Теперь вы переходите от абстракции к реализации.T абстрактная вещь.Вам нужно что-то реальное, реальный класс, который расширяет Data.

class Data {}
class SubData extends Data {}

interface Product<T extends Data>{
  void Customer(Plugin<T> plugin);
}

class TheProduct implements Product<SubData>{
  @Override
  public void Customer(Plugin<SubData> plugin){
  }
}

Customer - очень странное имя для метода, потому что это существительное и оно пишется с большой буквы.Мы написали бы registerCustomer, serveCustomer, sellPluginToCustomer.Вы поняли идею.

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