在Java泛型中有什么模仿OR的方法吗?

2022-09-03 01:13:39

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

喜欢

 <Integer or Float>

...无需创建一个公共接口并为整数和浮点数创建一个子类来实现它

如果没有,这样的东西可能会更有意义,更有用。

 <E extends Number> <E = (Integer|Float)>

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


答案 1

这是不可能的,我几乎看不到它的任何价值。您可以使用泛型来限制类型,例如在集合中。在这种情况下,使用运算符,您对类型的了解与对它们最具体的超类型的了解一样多。那么为什么不直接使用呢?orObjectObject

假设的:

List<E extends String or Number> list = //...

什么是类型?是还是?但是你不能有这种类型的变量。它不可能是,它不可能是 - 它只能是...list.get(0)StringNumberStringNumberObject

更新:由于您将相关示例更改为:

<Integer or Float>

你为什么不直接说:

<Number>

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


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

<E extends Serializable & Closeable>

这是非常有道理的 - 您可以在需要的地方使用类型的变量。换言之,必须同时扩展 和 。另请参见:具有多个类的 Java 泛型通配符ESerializableCloseableESerializableCloseable


答案 2

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

<E extends Connection or Statement or ResultSet>

这将允许我调用,无论实际类型是什么。换句话说,将包含所有提供类型的“API 交集”。在这种情况下,它将包含 java.sql.Wrapper java.lang.Object 中的所有方法。E.close()Eclose()

但不幸的是,你不能这样做。相反,请使用方法重载,例如

void close(Connection c);
void close(Statement s);
void close(ResultSet r);

或普通的旧instanceof

if (obj instanceof Connection) {
    ((Connection) obj).close();
}
else if (obj instanceof Statement) { //...

或者修复您的设计,因为您可能无论如何都不必与任意类型的API相交


推荐