gpt4 book ai didi

java - 如何识别哪些类型可以被泛化?

转载 作者:行者123 更新时间:2023-12-03 19:04:26 25 4
gpt4 key购买 nike

我知道基于对象的集合是类化的主要候选者,并且已经在集合库中进行了类化。除此之外,类或接口(interface)应该具备哪些属性和行为才能使其成为泛型的候选者?为什么要泛化 ThreadLocal 类或 AtomicReference 类?是什么导致了这个设计决定?

最佳答案

如果一个类可以与其他各种类具有相同的关系,那么该类很适合泛化。集合类被泛化是因为“包含”关系可以应用于任何对象类。 ComparableComparator 接口(interface)是通用的,因为“可以比较”的关系可以应用于许多不同的对象(尽管实际上这仅限于类自身内部和周围的对象Comparable 的层次结构)。

此外,如果您发现自己正在编写多个非常相似的类,其中唯一的区别是您正在操作的对象的类型,那么请考虑编写一个通用类。

编辑:

通过内置类 AtomicReferenceThreadLocal,“包含”关系适用于各种对象类型。 AtomicReferenceThreadLocal 对象仍然包含另一种类型的对象。这允许以类型安全的方式设置和返回特定类型,而无需让“get”和“set”方法返回/获取 Object,并且无需强制转换调用“get”方法时的返回类型。该关系适用于特定类型,但在类设计时不需要知道确切的类型。

编辑 2:

我能想到的使类通用的大多数示例都涉及“包含”关系。然而,这只是泛型关系的一个具体示例,尽管 Collections 框架基于“包含”关系,并且它提供了许多“包含”泛型类。泛型关系不一定是“包含”,因此我将尝试举例说明可以泛型但关系是“包含”的地方。

想象一个抽象的 Shape 类,带有具体的类,例如 LineSquareCircle 等。现在我们定义知道如何绘制形状的接口(interface)ShapeDrawer。这里的关系是“画”。我们可以定义接口(interface):

public interface ShapeDrawer {
public void drawShape(Shape shape);
}

现在我们需要 ShapeDrawer 的特定具体实现,专门处理特定形状,例如CircleDrawerSquareDrawer

public class CircleDrawer implements ShapeDrawer {
public void drawShape(Shape shape) {/*...*/}
}

现在 CircleDrawer 中的 drawShape 方法必须在绘制它之前测试它的 shape 看它是否是一个 Circle .

现在,使用泛型的解决方案:

public interface ShapeDrawer<T extends Shape> {
public void drawShape(T shape);
}

现在,一个实现可以绘制一个特定的Shape:

public class CircleDrawer implements ShapeDrawer<Circle> {
public void drawShape(Circle circle) {/*...*/}
}

关于java - 如何识别哪些类型可以被泛化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987327/

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