然而,这完美无缺!
public static <E extends Number> void A() {
E x = (E)new Double(2.2);
}
善待你的编译器,它会善待你。你需要做的就是告诉它你的意思。
而且 - 当然 - 因为我们现在实际上是在对我们的编译器撒谎,它让我们可以做一些可怕的事情,比如:
public class Test {
public static <E extends Number> E makeOne() {
E x = (E) new Double(2.2);
return x;
}
// Some real compiler abuse.
public void test() {
Integer one = Test.<Integer>makeOne();
Double two = Test.<Double>makeOne();
Number three = Test.<Double>makeOne();
}
}
对于我们国内的读者……这不是泛型的使用方式。
哦-顺便说一句,您看到问题的原因是您在没有强制转换的情况下不匹配类型。
你的问题是一个概念问题。在 Generic 子句<E extends Number>
中传递的类型不是您最终决定使用的类型的占位符。您不只是延迟决定使用哪种类型。您承诺只使用与该子句匹配的类型,如果您违反该承诺,编译器必须警告您。
你的代码不被接受的原因是你正在这样做,你违背了这个承诺。你是说虽然调用者可以使用任何 Number
你将使用特定的Number
( Double
) 所以你违反了你为自己制定的规则并且编译器正在告诉你。