Java和泛型。不是0号吗?

时间:2011-07-25 22:05:41

标签: java generics numbers

我对这段代码缺少什么?

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

它说:

  

类型不匹配:无法从整数转换为N

谢谢!

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

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:12)

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

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

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

显然无效。

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

答案 2 :(得分:2)

您的代码存在的问题是,Java需要能够确认函数的返回类型需要转换为任何N extends Number的{​​{1}}。因此,特别是,如果我要使用N实例化类,如

Double

您遇到了麻烦,因为Zero<Double> z = new Zero<Double>(); z.zero(); 表示它返回zero但实际上会返回Double。类型错误表明编译器担心这样的事情会发生。

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

答案 3 :(得分:1)

0是int,但由于您的方法返回了一个对象,因此它将自动生成为Integer。问题是编译器不允许返回允许允许任何 子类的Integer。这只是因为你可以将你的类实例化为

new Zero<Double>()

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

答案 4 :(得分:1)

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