在Java泛型中是否有任何模仿OR的方法

Whi*_*cal 7 java generics inheritance

编辑:我改变了一个例子来获得这个想法:

喜欢

 <Integer or Float>
Run Code Online (Sandbox Code Playgroud)

...无需创建公共接口并为Integer和Float创建子类来实现它

如果没有,这样的事情可能会更有意义并且有用

 <E extends Number> <E = (Integer|Float)>
Run Code Online (Sandbox Code Playgroud)

如果?是一个通配符为什么我们不应该允许限制某些类型?

Tom*_*icz 10

这是不可能的,我几乎看不到它的任何价值.您使用泛型来限制类型,例如在集合中.在这种情况下or,对于运算符,您可以尽可能多地了解这两种类型的最具体的超类型Object.那么为什么不用Object呢?

假想:

List<E extends String or Number> list = //...
Run Code Online (Sandbox Code Playgroud)

是什么类型的list.get(0)?难道String 还是 Number?但是你不能拥有这种类型的变量.它不能String,它不能是Number-那只能是...... Object.

更新:因为您将有问题的示例更改为:

<Integer or Float>
Run Code Online (Sandbox Code Playgroud)

你为什么不说:

<Number>
Run Code Online (Sandbox Code Playgroud)

?请注意,该Number方法允许您轻松提取floatValue()intValue().你真的需要确切的类型吗?


请注意,您可以使用and运算符:

<E extends Serializable & Closeable>
Run Code Online (Sandbox Code Playgroud)

这是完全合理的 - 你可以使用E任何一种Serializable或哪种类型的变量Closeable.换句话说,E必须延伸SerializableCloseable.另请参见:具有多个类的Java泛型通配符.

  • @ user1352530:避免`ClassCastException`和编译时类型检查是首先包含泛型的原因之一. (2认同)

Luk*_*der 5

在非常极端的情况下(没有的Java 7之前的版本AutoCloseable),我也希望能够做到这一点。例如

<E extends Connection or Statement or ResultSet>
Run Code Online (Sandbox Code Playgroud)

E.close()不管实际的类型是什么,这都允许我打电话。换句话说,E将包含所有提供的类型的“ API交集”。在这种情况下,它将包含close()和来自java.sql.Wrapper和的所有方法java.lang.Object

但不幸的是,您无法做到这一点。而是使用方法重载,例如

void close(Connection c);
void close(Statement s);
void close(ResultSet r);
Run Code Online (Sandbox Code Playgroud)

还是普通的 instanceof

if (obj instanceof Connection) {
    ((Connection) obj).close();
}
else if (obj instanceof Statement) { //...
Run Code Online (Sandbox Code Playgroud)

或修复您的设计,因为无论如何您不必交叉任何类型的API