используя параметры шаблона в объявлении интерфейса Java - PullRequest
0 голосов
/ 23 ноября 2018

Я пришел из C ++ и сейчас беру Java-класс, более конкретно изучая шаблоны проектирования.В прошлом классе профессор дал нам пример проекта, чтобы помочь нам начать работу с шаблоном Prototype, и в проекте была декларация интерфейса, которую я не очень хорошо понимал (и также не спрашивал профессора: /)

package pattern.prototype.impl;

public interface IPrototype<T extends IPrototype> extends Cloneable {

    //clone: Permite realizar una clonacion superficial del prototipo.
    public T clone();

    //deepClone: Permite realizar una clonación profunda del prototipo.
    public T deepClone();
}

Может ли кто-нибудь дать мне какое-то объяснение относительно использования параметра T в этом контексте IPrototype<T extends IPrototype>.Какова его цель там?Это необходимо или только один способ сделать это?

Спасибо

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

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

Проблема в том, что IPrototype используется здесь как необработанный тип.Второй раз, когда он используется в строке, это просто IPrototype без переменной типа.Это не-нет в Java.

Что касается происходящего, все это означает, что параметр типа для IPrototype должен иметь тип IPrototype, то есть некоторый подкласс IProtoType.Взгляните на тип Java Enum, который использует точно такой же шаблон: https://docs.oracle.com/javase/10/docs/api/java/lang/Enum.html

public interface IPrototype<T extends IPrototype<T>> extends Cloneable {
//                                              ^^^ add this

    //clone: Permite realizar una clonacion superficial del prototipo.
    public T clone();

    //deepClone: Permite realizar una clonación profunda del prototipo.
    public T deepClone();
}
0 голосов
/ 23 ноября 2018

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

0 голосов
/ 23 ноября 2018

T является параметром типа и универсальным типом.

T расширяет IPrototype: Чтобы объявить параметр ограниченного типа, T может быть любым типом, который является подклассом IPrototype

public T clone (); тип возвращаемого значения будет общим.

public T deepClone (); тип возвращаемого значения будет универсальным (значит, может быть любым типом)

0 голосов
/ 23 ноября 2018

Это называется «Любопытно повторяющийся шаблон».Как следует из названия, он был обнаружен для кода, написанного на C ++, который использует шаблоны, однако шаблон работает и с Generics в Java.

Здесь я могу реализовать интерфейс следующим образом:

public class ConcretePrototype implements IPrototype<ConcretePrototype > {
    @Override
    public ConcretePrototype clone() { ... }

    @Override
    public ConcretePrototype deepClone() { ... }
}

Обратите внимание на сигнатуру переопределенных методов.Базовый интерфейс IPrototype не знает о ConcretePrototype, однако, используя CRTP, мы можем принудительно заставить ConcretePrototype возвращать значения своего собственного типа.

...