17

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

喜欢

 <Integer or Float>

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

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

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

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

4

3 回答 3

12

这是不可能的,我几乎看不到它有任何价值。您使用泛型来限制类型,例如在集合中。在这种情况下,使用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 泛型通配符与多个类SerializableCloseableESerializableCloseable

于 2012-07-24T14:44:50.910 回答
10

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

<E extends Connection or Statement or ResultSet>

E.close()无论实际类型是什么,这都可以让我打电话。换句话说,E将包含所有提供类型的“API 交集”。在这种情况下,它将包含, 以及来自和close()的所有方法。java.sql.Wrapperjava.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 相交

于 2012-07-24T14:48:10.467 回答
1

我看不到它的真正用途......但无论如何,我相信你最接近它的是为可能的实现扩展通用接口。

于 2012-07-24T14:46:53.397 回答