それでも、これは完全に機能します!
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
) を使用するため、自分で定めた規則を破っていて、コンパイラがあなたに告げていると言っています。