私は驚きましたが、...これはコンパイルされます。ここではJava:具体的なパラメータ化された型のnull以外の配列への参照を持つことができるのはなぜですか?
public <T extends Database> ColMetaData<T>[] getTableColumnsAsEnums() {
Class<? extends ColMetaData> cls = this.columnsEnumToken();
return cls.<ColMetaData<T>[]>getEnumConstants(); }
はcolumnsEnumTokenするための方法である:
// Returns a class token for an enum class
public Class<? extends ColMetaData> columnsEnumToken() {
return this.e_colsToken;
}
(私は下の2番目の行はコンパイルされませんなぜ私が見ることができますね)
いくつかの質問:
は、このメソッド「タイプです安全"?
なぜ、この行のコンパイルを行います。
Class<? extends ColMetaData> cls = this.columnsEnumToken();
をしかし、この1つはので、互換性のない型のコンパイルに失敗します。
Class<? extends ColMetaData<T>> cls = this.columnsEnumToken();
なぜそれが復帰する方法
getTableColumnsAsEnums()
ための法的です具体的なパラメータ化された型の配列ColMetaData<T>[]
私はこれらが厳密に動詞であると思っていました。なぜなら、それらを安全に操作するランタイム方法がなかったからです。
'cls。 []> getEnumConstants()' inはそれ自体が一般的なメソッドではないのでコンパイルしないでください。 –
最初の箇条書きに答えるには十分な情報がありません: 'columnsEnumToken()'とは何ですか?互換性のない型のエラーメッセージとは何ですか? –
ええ、それは 'return'ステートメントの山括弧に入れたいクラスを置くことができ、うまくいくようです。おそらく、エラーを報告するはずですが、タイプ情報は単に無視されるようです。 – scottb