代码之家  ›  专栏  ›  技术社区  ›  Scaramouche

在java接口声明中使用模板参数

  •  0
  • Scaramouche  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  1
  •   flakes    6 年前

    这被称为“奇怪的重复出现的模板模式”。顾名思义,它是用C++编写的,它使用模板,但该模式也适用于java中的泛型。

    在这里,我可以实现如下接口:

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

    请注意被重写方法的方法签名。基本接口 IPrototype 不知道 ConcretePrototype 然而,通过使用CRTP,我们可以实现这一点 返回其自身类型的值。

        2
  •  1
  •   Nenad    6 年前

    它不是模板参数,而是Java泛型类型,代表实现给定接口的任何类。在原型模式的上下文中,它不是必需的,只是一个可能的实现。

        3
  •  1
  •   GauravRai1512    6 年前

    公共T克隆(); 返回类型将是泛型的。

    公共T-deepClone(); 返回类型将是泛型的(方法可以是任何类型)

        4
  •  1
  •   markspace    6 年前

    顺便说一句,我很确定你使用的语法是错误的,所以最好还是通知你的老师。

    IPrototype 在这里用作原始类型。第二次在网上使用时,它只是 IPrototype

    至于发生了什么,这意味着 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();
    }