Java 子类声明中的类型参数
我目前正在学习泛型,很难理解它们的某些方面。我觉得我忽略了什么,所以这个问题听起来可能很愚蠢 据我所知,有:Java 子类声明中的类型参数,java,generics,types,arguments,Java,Generics,Types,Arguments,我目前正在学习泛型,很难理解它们的某些方面。我觉得我忽略了什么,所以这个问题听起来可能很愚蠢 据我所知,有: 占位符,称为“形式类型参数” 实际的“类型参数” 下面是一段示例代码,它与泛型和方法链接一起工作: class Clothing <T> { String material; String color; T setMaterial (String material) { this.material = material;
class Clothing <T> {
String material;
String color;
T setMaterial (String material) {
this.material = material;
return (T) this;
}
T setColor (String color) {
this.color = color;
return (T) this;
}
}
class Jeans extends Clothing <Jeans> {
}
class Pants extends Clothing <Pants> {
}
class Executor {
public static void main(String[] args){
Jeans jeansPair = new Jeans().setMaterial("cotton").setColor("green");
}
}
class服装{
弦材料;
字符串颜色;
设置材料(字符串材料){
这个材料=材料;
返回(T)这个;
}
T设置颜色(字符串颜色){
这个颜色=颜色;
返回(T)这个;
}
}
高级牛仔裤延伸到服装{
}
职业裤延伸服装{
}
类执行器{
公共静态void main(字符串[]args){
牛仔裤牛仔裤牛仔裤=新牛仔裤().setMaterial(“棉”).setColor(“绿色”);
}
}
问题是我不明白为什么像Jeans和Pants这样的类型片段是在子类声明中提供的,而不是像main方法中那样的实例化
如果您能提供此规则的链接,我将不胜感激。我已经查找了很多信息,如有界参数、原始类型、擦除等,但没有完全找到我要查找的内容
顺便说一句:如果您使用的是构建器模式,而不是您在这里描述的可变模式,那么使用这些泛型可能会更容易。我只是提供了这样一个构建器结构的示例
Jeans
和Pants
是没有泛型参数的具体类型,这就是为什么在构造它们时只需说newjeans()
/new Pants()
;它们没有调用方可以指定的泛型类型。由于它们还扩展了泛型类型,您可以说:
Clothing<Jeans> jeans = new Jeans()....;
服装牛仔裤=新牛仔裤()。。。。;
如果要按对象的泛型父类型引用该对象。这与任何其他父/子类型关系没有什么不同,例如List
与ArrayList
。这些类只是对泛型类型的值进行硬编码
您可以想象将Clothing
中的方法复制到Jeans
和Pants
中,并将T
分别替换为Jeans
和Pants
,如果这有助于您了解这些类在做什么
至于为什么在子类声明中提供类型参数,这是一种风格选择,没有关于何时使用的规则。当您有有限数量的类型可以/应该用作泛型类型时,这很好,因为现在调用方不必每次都显式指定类型。然而,在“泛型”情况下,泛型类型表示任意数量的不同具体类型,这种模式是有害的,因为类作者需要为每个给定类型定义一个新的子类。这是一种奇怪的重复出现的泛型模式,或者C++中的模板模式,你可能也想看看这个帖子,这也是一个允许抽象基类执行方法链接的方法。