编辑:我改变了一些例子来获得这个想法:
喜欢
<Integer or Float>
...无需创建通用接口并为 Integer 和 Float 创建子类来实现它
如果没有,这样的事情可能会更有意义并且有用
<E extends Number> <E = (Integer|Float)>
如果 ?是通配符为什么我们不应该允许限制某些类型?
编辑:我改变了一些例子来获得这个想法:
喜欢
<Integer or Float>
...无需创建通用接口并为 Integer 和 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>
这很有意义 - 您可以在需要或需要的E
地方使用类型变量。换句话说,必须同时扩展和。另请参阅:Java 泛型通配符与多个类。Serializable
Closeable
E
Serializable
Closeable
在非常极端的情况下(Java 7 之前没有AutoCloseable
),我也希望能够做到这一点。例如
<E extends Connection or Statement or ResultSet>
E.close()
无论实际类型是什么,这都可以让我打电话。换句话说,E
将包含所有提供类型的“API 交集”。在这种情况下,它将包含, 以及来自和close()
的所有方法。java.sql.Wrapper
java.lang.Object
但不幸的是,你不能这样做。相反,使用方法重载,例如
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 相交
我看不到它的真正用途......但无论如何,我相信你最接近它的是为可能的实现扩展通用接口。