だが、私はこの機能を持っているとしましょう。そして私は、この他の機能を持っている:なぜ、Javaは汎用スーパータイプキャストを許可しませんが、ワイルドカードキャストで許可しますか?</p> <pre><code>Table<Record> tableOfRecord() {} </code></pre> <p>と種類<code>TableRecord<R extends TableRecord> extends Record</code>:
<R extends TableRecord<R>> Table<R> table(Table<R> table, String filtered) {
// ...
return (Table<R>) tableOfRecord();
}
は、上記のコンパイルに失敗します。
error: incompatible types: Table<Record> cannot be converted to Table<R>
はしかし、これはコンパイルし、正常に動作:
return (Table<R>) ((Table<?>) tableOfRecord());
これが許可されている理由は、私はわかりません前の例はそうではありません。
わかりません。しかしどちらも意味的に正しければ、AFAICS - 'テーブル'は 'テーブル'ではなく、 'R'が'レコード 'でなければ不可能です。 –
コンパイラの警告を見てください。それは "チェックされていないキャスト"を叫んでいます。 >あなたがやっている帽子は 'return(Integer)((Object)" hello ")とほぼ同じです。" http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why -arent-javas-generics-implicitly-p –
ほとんどの一般的な情報は、実行時に消去されます。 JVMは '' Table'''から '' Table'''へのキャストを見て、このキャストが実際にタイプセーフであることを確認することはできません(実際にはそうではありません)。したがって、ジェネリック医薬品をキャスティングするときにチェックされていないキャスト警告が表示されます。 –