Java 泛型 - 类型必须来自 Class T“或”extend S

CLR*_*123 7 java string generics

我正在开发一个ComboBox(更多的是为了上下文而不是实际意义),我想知道Java泛型中是否存在“或”运算符。目前,声明看起来像这样:

public class SComboBox<T extends ComboBoxItem> extends JPanel {
Run Code Online (Sandbox Code Playgroud)

ComboBoxItem我为可在组合框中使用的项目创建的接口在哪里。然而,我也想接受String作为一种类型,这似乎是一项艰巨的任务,因为:

  1. String是 afinal class所以任何人都无法扩展它。
  2. 我不确定你是否可以输入类似“|”的内容 (或)运算符,或者直接指定一个可接受的类。由于一个“与”运算符(<T extends A & B>),我想“或”(|)也是有意义的。

我的问题本质上是第 2 点。我可以在泛型中指定一个我想要接受和/或使用类似“|”的类吗?如果没有,是否有任何解决方法或者我应该放弃使用泛型的想法?

Rea*_*tic 3

泛型没有“或”运算符,原因很简单。

在开头声明类型的想法是允许您在类的实现中使用该类型的方法。

当您使用“and”运算符 ( extends A & B) 时,您知道无论传递给您什么对象,您都可以访问该类的任何A方法以及该类的任何B方法。

但如果是“或”会怎样呢?然后向您传递一个对象,该对象可以是ComboBoxItem允许您使用ComboBoxItem的方法,也可以只是一个字符串,这意味着您不能使用任何此类方法。在编译时,您不知道传递的是哪个对象,因此给出类型是没有意义的。

“或”没有帮助。如果您没有使用该对象的任何方法,那么您也可以extends根本不使用。


这里真正的问题是您想要做什么,这可以适用于字符串以及组合框项目,但不适用于其他任何内容。闻起来像是设计问题。