在Java泛型中有什么模仿OR的方法吗?
2022-09-03 01:13:39
编辑:我改变了一些例子来获得这个想法:
喜欢
<Integer or Float>
...无需创建一个公共接口并为整数和浮点数创建一个子类来实现它
如果没有,这样的东西可能会更有意义,更有用。
<E extends Number> <E = (Integer|Float)>
如果?是一个通配符,为什么我们不应该允许限制某些类型?
编辑:我改变了一些例子来获得这个想法:
喜欢
<Integer or Float>
...无需创建一个公共接口并为整数和浮点数创建一个子类来实现它
如果没有,这样的东西可能会更有意义,更有用。
<E extends Number> <E = (Integer|Float)>
如果?是一个通配符,为什么我们不应该允许限制某些类型?
这是不可能的,我几乎看不到它的任何价值。您可以使用泛型来限制类型,例如在集合中。在这种情况下,使用运算符,您对类型的了解与对它们最具体的超类型的了解一样多。那么为什么不直接使用呢?or
Object
Object
假设的:
List<E extends String or Number> list = //...
什么是类型?是还是?但是你不能有这种类型的变量。它不可能是,它不可能是 - 它只能是...list.get(0)
String
Number
String
Number
Object
更新:由于您将相关示例更改为:
<Integer or Float>
你为什么不直接说:
<Number>
?请注意,Number
具有允许您轻松提取 和 .你真的需要确切的类型吗?floatValue()
intValue()
请注意,您可以使用运算符:and
<E extends Serializable & Closeable>
这是非常有道理的 - 您可以在需要的地方使用类型的变量。换言之,必须同时扩展 和 。另请参见:具有多个类的 Java 泛型通配符。E
Serializable
Closeable
E
Serializable
Closeable
在非常极端的情况下(在Java 7之前没有AutoCloseable
),我也希望能够做到这一点。例如:
<E extends Connection or Statement or ResultSet>
这将允许我调用,无论实际类型是什么。换句话说,将包含所有提供类型的“API 交集”。在这种情况下,它将包含 java.sql.Wrapper
和 java.lang.Object
中的所有方法。E.close()
E
close()
但不幸的是,你不能这样做。相反,请使用方法重载,例如
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相交