繁体   English   中英

Java和泛型。 不是0号吗?

[英]Java and generics. Isn't 0 a Number?

关于这段代码,我错过了什么?

public class Zero<N extends Number> {
  public N zero() {
    return new Integer(0);
  }
}

它说:

类型不匹配:无法从Integer转换为N.

谢谢!

更新我已将代码段更改为使用整数。 同样的事情发生了 即使在创建Number的匿名子类时也会发生这种情况。 这可能是Eclipse的错吗?

虽然Integer是一个数字,但整数可能与N不兼容,N可以是Number的任何子类。

不保证Integer是N的超类,因此不能只将Integer值设置为N类型的对象。

以这种方式思考:如果有人将Zero<N>实例化为Zero<Double> ,则该类有效地变为:

public class Zero {
  public Double zero() {
    return new Integer(0);
  }
}

这显然是无效的。

此外,您也不能return 0 ,因为以相同的方式,编译器无法知道如何将其转换为N.(编译器只能知道它所知道的autobox类型,但是通过使用泛型扩展可用的类型还包括Number的自定义实现。)

您的代码的问题是Java需要能够确认函数的返回类型需要可以转换为任何N N extends Number 所以,特别是,如果我用Double实例化类,就像在

Zero<Double> z = new Zero<Double>();
z.zero();

你遇到了麻烦,因为zero表示它返回一个Double但它实际上返回一个Integer 类型错误表明编译器担心会发生类似这样的事情。

据我所知,在Java中没有好办法,因为泛型是通过擦除实现的; 它无法知道论证的类型是什么。

0是一个int ,但由于您的方法返回一个对象,它将被自动装箱到一个Integer 问题是编译器不允许返回允许任何子类NumberInteger 那只是因为你可以将你的类实例化为

new Zero<Double>()

在这种情况下,返回Integer将与预期的返回类型不兼容: Double

当'N'扩展'Number'时,'N'成为'Number'的特化,你不能将基类的实例分配给它的特化(upcast issue)的引用变量。 返回时也很好。 无法使用特化类型返回基类实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM