在Java泛型中有没有模仿或使用的方法

在Java泛型中有没有模仿或使用的方法,java,generics,inheritance,Java,Generics,Inheritance,编辑:我稍微改变了一下获得这个想法的例子: 像 <Integer or Float> …而无需创建公共接口并为Integer和Float创建子类来实现它 如果不是这样的话,像这样的东西可能更有意义,也更有用 <E extends Number> <E = (Integer|Float)> 如果?是一个通配符为什么不允许我们限制某些类型?这是不可能的,我几乎看不到任何价值。您可以使用泛型来限制类型,例如在集合中。使用或运算符,您对类型的了解程度与

编辑:我稍微改变了一下获得这个想法的例子:

 <Integer or Float>

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

如果不是这样的话,像这样的东西可能更有意义,也更有用

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


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

这是不可能的,我几乎看不到任何价值。您可以使用泛型来限制类型,例如在集合中。使用
运算符,您对类型的了解程度与对这两种类型中最具体的超类型的了解程度相同,在本例中为
对象
。那么为什么不直接使用
对象

假设的:

List<E extends String or Number> list = //...
你为什么不说:

<Number>

这很有道理——您可以在需要
Serializable
Closeable
的地方使用
E
类型的变量。换句话说,
E
必须同时扩展
Serializable
Closeable
。另请参见:。

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

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

<E extends Connection or Statement or ResultSet>
或普通的旧
实例

if (obj instanceof Connection) {
    ((Connection) obj).close();
}
else if (obj instanceof Statement) { //...

或者修复您的设计,因为您可能无论如何都不必与任意类型的API相交

为什么要这样做?它们看起来像粉笔和奶酪。这个要求对我来说毫无意义。字符串是像数字这样的数学实体,在某些操作中是闭合的吗?我不这么认为。正是因为字符串是最终的,一个或解决方案将需要更多,因为我们无法解决它与替代方案我认为这听起来像你需要一个真正的对象,而不是集合。这里缺少一些封装。Ok for list很愚蠢,但对于其他用途,可能不是这样。甚至可以有一个字符串a=list.get(0)或一个整数a=list.get(0),丑陋但并非不可能或不正确。它可能会抛出一个CastExeption,如果error@user1352530:避免类CastException和编译时类型检查是将泛型放在首位的原因之一。我用一种新的方法更新了这个问题,这与me@User1352530:我觉得或总是感到困惑和容易出错。是时候重新设计需求了吗?特别是在Java中,我尽量避免使用强制转换。正如Tomasz在回答时所说的,它是受支持的。
我几乎看不到它有任何价值
我想重载一个方法,并且有
flatMap(function1mapper)
flatMap(function1mapper)
,但我不能这样做,因为我得到的错误是它们的擦除是相同的。当我搜索泛型或泛型时,我希望能用它来解决Java 7中的这个问题,所有这些类都实现了
,所以现在就足够了。@TomaszNurkiewicz:我知道。这只是一个例子@格里菲多格:见托马斯兹的答案。JDBC类型扩展了
AutoCloseable
,而不是
Closeable
(它也扩展了
AutoCloseable
)另一个类似的情况是数字接口,双精度,整数。。。有价值的,但数字,超级,没有。另外:当您需要T=具体的子类型,但不需要super或
<E extends Connection or Statement or ResultSet>
void close(Connection c);
void close(Statement s);
void close(ResultSet r);
if (obj instanceof Connection) {
    ((Connection) obj).close();
}
else if (obj instanceof Statement) { //...