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();
        }
    }
}

两个返回行都会导致编译错误:(Type mismatch: cannot convert from Wrapper.General to T对于Wrapper.Specific to T第二个返回)。

4

4 回答 4

2

如果T是 的子类型General,则 的实例General不一定是T。如果要返回 a T,,则必须从另一个工厂方法(作为参数或抽象方法)中获取它,或者通过接受 aClass<? extends T>并通过反射实例化它。

于 2012-12-14T13:57:20.710 回答
0

好吧,您不能确定 T 是 General 因此编译器会抱怨。你应该做这样的事情:

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

当你说“T extends General”时,General 是超类,T 是子类

但是在返回类型期间,您试图返回 Parent(General) 对象,而预期的返回类型是 T(请记住,子类引用不能包含父类对象)。

像这样更改您的代码部分。

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 对您来说真的很重要,那么您需要创建一个 Adapter 类,它将您的 General(parent) 对象转换为 child(T) 然后返回它

于 2012-12-14T14:00:31.023 回答
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 回答