我对这段代码缺少什么?
public class Zero<N extends Number> {
public N zero() {
return new Integer(0);
}
}
它说:
类型不匹配:无法从整数转换为N
谢谢!
更新我已将代码段更改为使用整数。同样的事情发生了即使在创建Number
的匿名子类时也会发生这种情况。这可能是Eclipse的错误吗?
答案 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)的引用变量。返回时也很好。无法使用特化类型返回基类实例。