Whi*_*cal 7 java generics inheritance
编辑:我改变了一个例子来获得这个想法:
喜欢
<Integer or Float>
Run Code Online (Sandbox Code Playgroud)
...无需创建公共接口并为Integer和Float创建子类来实现它
如果没有,这样的事情可能会更有意义并且有用
<E extends Number> <E = (Integer|Float)>
Run Code Online (Sandbox Code Playgroud)
如果?是一个通配符为什么我们不应该允许限制某些类型?
Tom*_*icz 10
这是不可能的,我几乎看不到它的任何价值.您使用泛型来限制类型,例如在集合中.在这种情况下or,对于运算符,您可以尽可能多地了解这两种类型的最具体的超类型Object.那么为什么不用Object呢?
假想:
List<E extends String or Number> list = //...
Run Code Online (Sandbox Code Playgroud)
是什么类型的list.get(0)?难道String 还是 Number?但是你不能拥有这种类型的变量.它不能String,它不能是Number-那只能是...... Object.
更新:因为您将有问题的示例更改为:
<Integer or Float>
Run Code Online (Sandbox Code Playgroud)
你为什么不说:
<Number>
Run Code Online (Sandbox Code Playgroud)
?请注意,该Number方法允许您轻松提取floatValue()和intValue().你真的需要确切的类型吗?
请注意,您可以使用and运算符:
<E extends Serializable & Closeable>
Run Code Online (Sandbox Code Playgroud)
这是完全合理的 - 你可以使用E任何一种Serializable或哪种类型的变量Closeable.换句话说,E必须延伸Serializable和Closeable.另请参见:具有多个类的Java泛型通配符.
在非常极端的情况下(没有的Java 7之前的版本AutoCloseable),我也希望能够做到这一点。例如
<E extends Connection or Statement or ResultSet>
Run Code Online (Sandbox Code Playgroud)
E.close()不管实际的类型是什么,这都允许我打电话。换句话说,E将包含所有提供的类型的“ API交集”。在这种情况下,它将包含close()和来自java.sql.Wrapper和的所有方法java.lang.Object。
但不幸的是,您无法做到这一点。而是使用方法重载,例如
void close(Connection c);
void close(Statement s);
void close(ResultSet r);
Run Code Online (Sandbox Code Playgroud)
还是普通的 instanceof
if (obj instanceof Connection) {
((Connection) obj).close();
}
else if (obj instanceof Statement) { //...
Run Code Online (Sandbox Code Playgroud)
或修复您的设计,因为无论如何您不必交叉任何类型的API
| 归档时间: |
|
| 查看次数: |
6296 次 |
| 最近记录: |