【问题标题】:Type arguments in sub class declarations子类声明中的类型参数
【发布时间】:2016-07-21 08:19:58
【问题描述】:

我目前正在学习泛型,但很难理解它们的某些方面。我觉得我忽略了一些东西,所以这个问题可能听起来很愚蠢。

我知道有:

  1. 占位符,称为“正式类型参数”。
  2. 实际的“类型参数”。

这是我的一段示例代码,其中包含有效的泛型和方法链:

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

}

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

如果您提供此规则的链接,我将不胜感激——我已经查找了很多信息,例如有界参数、原始类型、擦除等,但没有完全找到我要查找的内容。

谢谢

【问题讨论】:

标签: java generics types arguments


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2017-05-31
    • 2020-07-18
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多