在子类声明中键入参数

时间:2016-04-01 13:37:48

标签: java generics types arguments

我目前正在学习仿制药,并且很难理解它们的某些方面。我觉得我已经忽视了一些东西,所以这个问题可能听起来很愚蠢。

我知道有:

  1. 占位符,称为' 正式类型参数'。
  2. 实际' 类型参数'。
  3. 这是我使用泛型和方法链接的示例代码:

    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");
        }
    
    }
    

    问题是我不明白为什么在子类声明中提供诸如 Jeans Pants 之类的类型,而不是像实例中那样的实例化。主要方法。

    如果你提供了这个规则的链接,我将不胜感激 - 我已经查了很多信息,例如有界参数,原始类型,擦除等,但是我找不到我想要的东西。

    谢谢

1 个答案:

答案 0 :(得分:0)

除此之外:如果您使用的是构建器模式而不是您在此处描述的可变模式,那么您可能更容易使用这些泛型。我只是answered a related question提供了这种构建器结构的示例。

JeansPants是没有通用参数的具体类型,这就是为什么在构建它们时你只需说new Jeans() / new Pants();它们没有调用者可以指定的泛型类型。由于它们也扩展了泛型类型,您可以说:

Clothing<Jeans> jeans = new Jeans()....;

如果您想通过其通用父类型引用该对象。这与任何其他父/子类型关系没有什么不同,例如List<String>ArrayList<String>。这些类只是对泛型类型的值进行硬编码。

您可以想象将Clothing中的方法分别复制到JeansPants,并将T分别替换为JeansPants,如果是帮助您了解这些类正在做什么。

至于为什么在子类声明中提供了类型参数,它是一种风格选择,没有关于何时应该使用它的规则。当你有/可以用作泛型类型的有限数量的类型时,这很好,因为现在调用者不必每次都明确指定类型。然而在&#34;泛型&#34;如果泛型类型表示任意数量的不同具体类型,则此模式是有害的,因为类作者需要为每个给定类型定义新的子类。