在Javagenerics中是否有任何模仿OR的方法
编辑:我改变了一个例子来获得这个想法:
喜欢
…无需创建公共接口并为Integer和Float创建子类来实现它
如果没有,这样的事情可能会更有意义并且更有用
如果? 是一个通配符为什么我们不应该允许限制某些类型?
这是不可能的,我几乎看不到任何价值。 您使用generics来限制类型,例如在集合中。 使用or
运算符,您可以尽可能多地了解类型,在这种情况下,您知道两种类型的最具体的超类型。 那么为什么不使用Object
呢?
假想:
List list = //...
list.get(0)
的类型是什么? 是String
还是 Number
? 但你不能拥有这种类型的变量。 它不能是String
,它不能是Number
– 它只能是… Object
。
更新:因为您将有问题的示例更改为:
你为什么不这么说:
? 请注意, Number
具有允许您轻松提取floatValue()
和intValue()
。 你真的需要确切的类型吗?
请注意,您可以使用and
运算符:
这非常有意义 – 您可以使用E
类型的变量,其中需要Serializable
或Closeable
。 换句话说, E
必须扩展Serializable
和Closeable
。 另请参见: 具有多个类的Javagenerics通配符 。
在非常极端的情况下(没有AutoCloseable
的Java 7之前版本),我本来也希望能够做到这一点。 例如
无论实际类型是什么,这都允许我调用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
我没有看到真正的用途……但无论如何,我相信你最接近它的是为可能的实现扩展通用接口。