Java和泛型。Isn';你不是一个数字吗?

Java和泛型。Isn';你不是一个数字吗?,java,generics,numbers,Java,Generics,Numbers,关于这段代码,我遗漏了什么 public class Zero<N extends Number> { public N zero() { return new Integer(0); } } 公共类零{ 公共N零(){ 返回新的整数(0); } } 它说: 类型不匹配:无法从整数转换为N 谢谢 更新我已将代码段更改为使用整数。同样的事情也会发生。甚至在创建Number的匿名子类时也会发生这种情况。是否是Eclipse在这方面出了问题?虽然整数是一个数字,但整数可

关于这段代码,我遗漏了什么

public class Zero<N extends Number> {
  public N zero() {
    return new Integer(0);
  }
}
公共类零{
公共N零(){
返回新的整数(0);
}
}
它说:

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

谢谢


更新我已将代码段更改为使用整数。同样的事情也会发生。甚至在创建
Number
的匿名子类时也会发生这种情况。是否是Eclipse在这方面出了问题?

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

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

这样想:如果有人将
Zero
实例化为
Zero
,那么类实际上变成:

public class Zero {
  public Double zero() {
    return new Integer(0);
  }
}
这显然是无效的


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

0是
int
,但是由于您的方法返回一个对象,它将自动装箱为一个
整数。问题是编译器不允许返回一个
整数,其中允许任何Number子类。这只是因为您可以将类实例化为

new Zero<Double>()
newzero()

在这种情况下,返回的
Integer
将与预期的返回类型不兼容:
Double
代码的问题是Java需要能够确认函数的返回类型需要转换为
N extends Number
,用于任何
N
。因此,特别是,如果我要用
双精度
实例化该类,如

Zero<Double> z = new Zero<Double>();
z.zero();
Zero z=new Zero();
z、 零();
您会遇到麻烦,因为
zero
表示它返回一个
Double
,但实际上它返回一个
整数。类型错误表示编译器担心会发生类似的情况


据我所知,在Java中没有很好的实现方法,因为泛型是通过擦除实现的;它不知道参数的类型。

当“N”扩展了“Number”时,“N”变成了“Number”的特化,并且您不能将基类的实例分配给其特化的引用变量(上溯问题)。这在返回时也适用。无法使用专门化类型返回基类实例。

请尝试Integer.valueOf(0),看起来您找到了自动装箱自动拆箱和泛型的另一个“特例”。0是一个
数字,但不一定是
N
Hmm,您是对的。如果用户代码将N限制为
BigDecimal
,则无法返回
整数。它显然没有正确的接口。我将返回并更改
zero
方法的签名,以返回
Number
并删除类型变量
N
。结果就我的目的来说已经足够了。如果你好奇的话,这里就是:“整数不一定是N的超类”?我相信你的意思是其他的,好像
Integer
是一个N的超类,它会使代码更加“不可编译”,因为你不能从一个声明其返回类型为
N
的方法返回一个
N
的超类。谢谢你的回答。我接受了克里斯托弗的回答,因为他是第一个(向我)说明问题所在的人。