1

次のロジックを機能させようとしています。

public class Wrapper {
    public static class General {
        public void copy(General g) {
            // copy fields
        }
        // General contents.
    }

    public static class Specific extends General {
        // Specific contents.
    }

    public static class GeneralLogic<T extends General> {
        public T load(ResultSet rs) {
            General o = new General();
            // Do stuff
            return new General();
        }
    }

    public static class SpecificLogic<T extends Specific> extends GeneralLogic<T> {
        @Override
        public T load(ResultSet rs) {
            Specific o = new Specific();
            o.copy(super.load(rs));
            // Do stuff
            return new Specific();
        }
    }
}

両方の return 行でコンパイル エラーが発生します: Type mismatch: cannot convert from Wrapper.General to T( Wrapper.Specific to T2 番目の return の場合)。

4

4 に答える 4

2

Tが のサブタイプである場合General、 のインスタンスGeneralは必ずしもではありませんT。a を返したい場合はT,、別のファクトリ メソッドから (引数または抽象メソッドとして) 取得するか、a を受け入れClass<? extends T>てリフレクションを介してインスタンス化する必要があります。

于 2012-12-14T13:57:20.710 に答える
0

「TはGeneralを拡張する」と言うとき、Generalはスーパークラスであり、Tは子クラスです。

ただし、リターンタイプ中に、期待されるリターンタイプがTであるときにParent(General)オブジェクトを返そうとしています(子クラス参照は親クラスオブジェクトを保持できないことに注意してください)。

このようにコードの一部を変更します。

public static class GeneralLogic<T extends General> {
        public General load(Object rs) {
            General o = new General();
            // Do stuff
            return new General();
        }
    }

    public static class SpecificLogic<T extends Specific> extends GeneralLogic<T> {
        @Override
        public Specific load(Object rs) {
            Specific o = new Specific();
            o.copy(super.load(rs));
            // Do stuff
            return new Specific();
        }
    }

ただし、戻り型をTにすることが非常に重要な場合は、General(親)オブジェクトを子(T)に変換して返すAdapterクラスを作成する必要があります。

于 2012-12-14T14:00:31.023 に答える
0

T が General であることを確認できないため、コンパイラは文句を言います。あなたはこのようなことをしているはずです:

   public  T  ResultSet (ResultSet rs){
        T t=getSomeObject();
        return t;
于 2012-12-14T13:51:19.987 に答える
0

私は次のようにします

 public static class General {
    public void copy(General g) {
        // copy fields
    }
    // General contents.
}

public static class Specific extends General {
    // Specific contents.
}

public interface Logic<T extends General>  {
    public T load(ResultSet rs);
}

public static class GeneralLogic implements Logic<General> {

    @Override
    public General load(ResultSet rs) {
        return new General();
    }

}

public static class SpecificLogic extends GeneralLogic {

    @Override
    public General load(ResultSet rs) {
        Specific o = new Specific();
        o.copy(super.load(rs));
        // Do stuff
        return o;
    }
}
于 2012-12-14T14:08:24.143 に答える