Java泛型类型扩展多个类

2 java generics interface

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

public class MyGeneric<T extends Melons & Berries>
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为“&”号后面应该是一个接口,而不是一个类。另外,在网上我看到了创建一个接口并让 T 实现该接口的建议,但是我不明白如何创建一个指定可以被泛型接受的类的接口。

rzw*_*oot 6

&意味着. T extends Melons & Berries意味着 T 必须是扩展两者的某种类型。显然你希望它的意思是or。事实并非如此。并且<T extends Melons | Berries>不是合法的java语法。有充分的理由——那是没有用的。

您可能会想:等等,您不能扩展两件事。是的,你可以 -extends泛型仅指超类型;extends它就像和的组合implements

例如:

void test(List<? extends Serializable & CharSequence> items) {
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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