2016-07-02 10 views
-1

だが、私はこの機能を持っているとしましょう。そして私は、この他の機能を持っている:なぜ、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()); 

これが許可されている理由は、私はわかりません前の例はそうではありません。

+0

わかりません。しかしどちらも意味的に正しければ、AFAICS - 'テーブル'は 'テーブル'ではなく、 'R'が'レコード 'でなければ不可能です。 –

+1

コンパイラの警告を見てください。それは "チェックされていないキャスト"を叫んでいます。 >あなたがやっている帽子は 'return(Integer)((Object)" hello ")とほぼ同じです。" http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why -arent-javas-generics-implicitly-p –

+0

ほとんどの一般的な情報は、実行時に消去されます。 JVMは '' Table'''から '' Table'''へのキャストを見て、このキャストが実際にタイプセーフであることを確認することはできません(実際にはそうではありません)。したがって、ジェネリック医薬品をキャスティングするときにチェックされていないキャスト警告が表示されます。 –

答えて

0

オブジェクトがTable<Record>Table<R>の両方になることはできませんことを、コンパイル時に証明することができるので、キャストが正しくないことが保証されているので、Table<R>Table<Record>からキャストすることは違法です。コンパイル時に不正確であることが証明できるキャストを書くことは不正です。

(Table<R>)(Table<?>)tableOfRecord()は、各キャストは、それ自体で、コンパイル時に正しくないことが知られていないので、正当で各々が2人の別個のキャスト、Table<?>のタイプTable<Record>から1、及びTable<R>からTable<?>から一つのシーケンスです。

関連する問題