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++中的模板模式,你可能也想看看这个帖子,这也是一个允许抽象基类执行方法链接的方法。