public class Test {
public static class Nested<T> {
public T val;
Nested(T val) { this.val = val; }
}
public static void main(String[] args) {
Nested<Integer> a = new Nested<Integer>(5);
Nested<Integer> b = new Nested<Integer>(2);
Integer diff = a.val - b.val;
}
}
上記のコードは正常に動作します。ただし、Nested にメソッドを追加すると、次のようになります。
T diff(Nested<T> other) { return this.val - other.val; }
コンパイル エラーが発生します。
operator - cannot be applied to T,T
これは私には理にかなっています。T の型は実行時に消去されるため、Java は Integer などの特定のクラスに対してのみ定義されている演算子を適用できません。しかし、なぜ機能a.val - b.val
するのですか?
編集:
良い答えがたくさん。みんな、ありがとう。その要点は、私が正しく理解していれば、コンパイラは Integer にキャストを追加できるということa.val - b.val
です。ただし、ジェネリック関数定義の本体内で発生するため (ここで T はまだ何でもかまいません)、コンパイラは " " を機能させるために必要なキャストを追加できません。これは、より興味深い質問につながります。つまり、Java コンパイラがインライン化できる場合、diff のような一般的な関数が機能する可能性があるでしょうか?a
b
Nested
<Integer
>this.val - other.val
-