1

私は今本当に混乱しています。別のプロジェクトで次のコードを問題なく使用しています。

public class ReadOnlyTable<T extends Model> implements ReadOnly<T> {
protected at.viswars.database.framework.core.DatabaseTable datasource;
private boolean debug = true;

protected ReadOnlyTable() {
    initTable();
}

protected void reloadDataSource() {
    initTable();
}

private void initTable() {
    boolean readOnlyClass = false;
    if (getClass().getSuperclass().equals(ReadOnlyTable.class)) readOnlyClass = true;

    Class<T> dataClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

最後の行は問題なく実行されます。今、私は2番目のプロジェクトを作成し、クラスの読み取りに問題があったため、可能な限り最も単純なケースを実行しようとしました:

public class GenericObject<T> implements IGenericObject<T> {
public GenericObject() {
    init();
}

private void init() {
    Class<T> clazz = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}

}

このクラスはここでインスタンス化されます:

        GenericObject<String> go = new GenericObject<String>();

2 番目の例では、常に次のエラー メッセージが表示されます。

スレッド「メイン」の例外 java.lang.ClassCastException: java.lang.Class は java.lang.reflect.ParameterizedType にキャストできません

私は何が欠けていますか?? これは私を夢中にさせます。どんな助けでも大歓迎です!

4

2 に答える 2

4

Stringから取得することはできませんgo。オブジェクト インスタンス化式 ( new GenericObject<String>()) の型パラメータは、実行時にどこにも存在しません。これは型消去です。

クラスまたはインターフェースが、特定の型引数を持つ別のクラスまたはインターフェースを拡張または実装するとき使用しようとしている手法が関係します。例えばclass Something extends GenericObject<String>。次に、この宣言情報をクラス オブジェクトから取得できます。これはあなたがしていることとはまったく関係ありません。

于 2013-02-09T21:44:52.930 に答える
3

を呼び出していますが、クラスにジェネリックgetGenericSuperclass()スーパークラスがありません。そのスーパークラスは、エラーが示すようにキャストできません。ObjectParameterizedType

getGenericInterfaces()[0]クラスはインターフェースのみを実装しているため、おそらく を使用したいと思うでしょう。

詳細はこちら: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces()

于 2013-02-09T14:50:53.443 に答える