在Javagenerics中是否有任何模仿OR的方法

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

喜欢

 

…无需创建公共接口并为Integer和Float创建子类来实现它

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

    

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

这是不可能的,我几乎看不到任何价值。 您使用generics来限制类型,例如在集合中。 使用or运算符,您可以尽可能多地了解类型,在这种情况下,您知道两种类型的最具体的超类型。 那么为什么不使用Object呢?

假想:

 List list = //... 

list.get(0)的类型是什么? 是String 还是 Number ? 但你不能拥有这种类型的变量。 它不能是String ,它不能是Number – 它只能是… Object

更新:因为您将有问题的示例更改为:

  

你为什么不这么说:

  

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


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

  

这非常有意义 – 您可以使用E类型的变量,其中需要SerializableCloseable 。 换句话说, E必须扩展SerializableCloseable 。 另请参见: 具有多个类的Javagenerics通配符 。

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

  

无论实际类型是什么,这都允许我调用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

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