gpt4 book ai didi

具有有界通配符的 Java 泛型

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:46:55 25 4
gpt4 key购买 nike

类声明有什么区别

public abstract class Super1<T extends Super1<T>> {...}  

public abstract class Super2<T extends Super2<? super T>> {...}

使用第一种方法,我能够创建一个子类(类似于 Java 中的 Enum 类型)

public class Sub1 extends Super1<Sub1> {...}

但我想知道是否可以像 2nd 这样的父类(super class)声明......它有什么意义,但我无法创建像这样的子类

public class Sub2 extends Super2<Object> {...}

我认为 Object 可以用作 T 的父类(super class)型??我能想到的另一种形式是

public abstract class Super3<T extends Super3<? extends T>>

我正在尝试学习泛型,感谢任何帮助。

最佳答案

当您处理具有继承自引用泛型类型时,这些类型的声明通常会出现。这里的关键字是 - Self-Referentialinheritance

让我们通过一个例子来理解这一点。假设我们有一个类 Car它实现了一个 Comparable<Car> , 和 Car 的子类- Mercedes :

class Car implements Comparable<Car> { ... }
class Mercedes extends Car { }

现在,您还需要 Mercedes具有可比性,因此您可能认为让我们实现一个 Comparable<Mercedes>在那里,你做的:

class Mercedes extends Car implements Comparable<Mercedes> { }

.. 那里是你得到一个错误的地方。问题是,现在 Mercedes类实现了 Comparable<Car>Comparable<Mercedes> , 这是不允许的。

进一步阅读:

因此,您删除了 Comparable<Mercedes>从那里。现在你剩下 Mercedes类实现 Comparable<Car> .

然后你创建一个类,它使用像这样的自引用类型参数:

class Garage<T extends Comparable<T>> { }

在创建一个实例时,同时使用 CarMercedes ,你这样做:

Garage<Car> carComp = new Garage<Car>();
Garage<Mercedes> mercedesComp = new Garage<Mercedes>();

你能找出错误吗?是的,它在第二个声明中。 Mercedes不能使用类型参数,因为它不满足边界 T extends Comparable<T> .作为Mercedes实现一个 Comparable<Car> .那么现在该怎么办呢?

这里是该声明的用法。让我们改变你的类(class)Garage像这样:

class Garage<T extends Comparable<? super T>> { }

.. 然后你的 2 实例化将成功通过,就像现在一样 Mercedes满足边界。

关于具有有界通配符的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com