在 java 接口声明中使用模板参数
using template parameters in java interface declaration
我来自 C++,现在正在学习 Java class,更具体地研究设计模式。最后class,教授给了我们一个示例项目,帮助我们开始使用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();
}
任何人都可以给我一些关于在上下文 IPrototype<T extends IPrototype>
中使用参数 T
的解释。它在那里的目的是什么?有必要还是只有一种方法?
谢谢
这叫做"Curiously re-occurring template pattern"。顾名思义,它被发现用于使用模板的 C++ 编写的代码,但是,该模式也适用于 Java 中的泛型。
这里我可以实现接口如下:
public class ConcretePrototype implements IPrototype<ConcretePrototype > {
@Override
public ConcretePrototype clone() { ... }
@Override
public ConcretePrototype deepClone() { ... }
}
注意重写方法的方法签名。基本接口 IPrototype
不知道 ConcretePrototype
,但是,通过使用 CRTP,我们可以强制使用它自己类型的 ConcretePrototype
returns 值。
它不是模板参数,而是 Java 泛型类型,它代表任何 class 实现给定接口。在原型模式的上下文中,这不是必需的,只是一种可能的实现。
T 是类型参数也是泛型。
T extends IPrototype : 要声明有界类型参数,T 可以是 IPrototype
的子类的任何类型
public T clone(); return 类型将是通用的。
public T deepClone(); return 类型将是通用的(意味着可以是任何类型)
顺便说一句,我很确定你使用的语法是错误的,所以无论如何最好通知你的老师。
问题是 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();
}
我来自 C++,现在正在学习 Java class,更具体地研究设计模式。最后class,教授给了我们一个示例项目,帮助我们开始使用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();
}
任何人都可以给我一些关于在上下文 IPrototype<T extends IPrototype>
中使用参数 T
的解释。它在那里的目的是什么?有必要还是只有一种方法?
谢谢
这叫做"Curiously re-occurring template pattern"。顾名思义,它被发现用于使用模板的 C++ 编写的代码,但是,该模式也适用于 Java 中的泛型。
这里我可以实现接口如下:
public class ConcretePrototype implements IPrototype<ConcretePrototype > {
@Override
public ConcretePrototype clone() { ... }
@Override
public ConcretePrototype deepClone() { ... }
}
注意重写方法的方法签名。基本接口 IPrototype
不知道 ConcretePrototype
,但是,通过使用 CRTP,我们可以强制使用它自己类型的 ConcretePrototype
returns 值。
它不是模板参数,而是 Java 泛型类型,它代表任何 class 实现给定接口。在原型模式的上下文中,这不是必需的,只是一种可能的实现。
T 是类型参数也是泛型。
T extends IPrototype : 要声明有界类型参数,T 可以是 IPrototype
的子类的任何类型public T clone(); return 类型将是通用的。
public T deepClone(); return 类型将是通用的(意味着可以是任何类型)
顺便说一句,我很确定你使用的语法是错误的,所以无论如何最好通知你的老师。
问题是 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();
}