gpt4 book ai didi

Java 泛型类型扩展多个类

转载 作者:行者123 更新时间:2023-12-02 18:20:41 28 4
gpt4 key购买 nike

泛型类的类型如何扩展多个类?例如,假设我有泛型,我希望能够获取作为 Melons 或 Berries 子类的对象,但不能获取作为 Fruits 其他子类子类的对象?我在想类似的事情

public class MyGeneric<T extends Melons & Berries>

但这不起作用,因为在&符号之后需要一个接口(interface),而不是一个类。此外,我在网上看到了创建一个接口(interface)并让 T 实现该接口(interface)的建议,但是我不明白如何创建一个接口(interface)来指定泛型可以接受的类。

最佳答案

&表示T extends Melons & Berries意味着 T 必须是扩展两者 的某种类型。您显然希望它表示。它没有。和 <T extends Melons | Berries>不是合法的 java 语法。有充分的理由 - 那将是无用的。

您可能会想:等等,您不能扩展 2 个东西。是的,你可以 - extends在泛型中仅指父类(super class)型;就像 extends 的组合和 implements .

例如:

void test(List<? extends Serializable & CharSequence> items) {
}

可以通过传递 List<String> 来调用.那是因为 StringSerializable 的子类型, 也是 CharSequence 的子类型.

这里的“要点”是,当您从此列表中获取一个元素时,您可以将其视为其中之一。因为它是 - 它是两者的列表。

Java 中没有办法说:“我想接受浆果列表或甜瓜列表,但不接受苹果列表”。之所以没有办法这么说,是因为它没用:

  • 如果您可以对甜瓜和浆果进行某种操作但不能对香蕉进行操作,那么无论是哪种操作都必须在某种接口(interface)中进行定义。也许 Melons 和 Berries 都实现了“SeededFruit”,而 Banana 则没有。在那种情况下,只需写 List<? extends SeededFruit>不是。
  • 如果您只想使用所有水果(也包括香蕉)共享的甜瓜和浆果的方面,只需写 List<? extends Fruit> - 为什么要施加任意限制?
  • 如果你想写if (x instanceof Melons) doThing1; else if (x instanceof Berries) doThing2; - java 不是“意味着”的。如果每个人都编写这样的代码,那么有很多 java 没有的东西会非常方便。但是 java 没有,也不会有,人们通常不会那样写他们的 java 代码。通常如果有人这样做,他们正在编写非常“糟糕”的代码,因为它过于复杂和/或难以维护和/或难以在面对不断变化的需求时采用,并且不必要地如此:你可以用不同的方式编写它并避免这些陷阱。

关于Java 泛型类型扩展多个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70919263/

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