尝试使用泛型对类进行子类型化

时间:2014-04-14 13:21:15

标签: java generics

我在尝试创建子类型类时遇到问题,并且使用某个泛型类型的对象的ArrayList调用其超级构造函数。我试图让这段代码工作。我希望我的SubTypes只接受 X 类型的 GenericObjects 列表。

    public class SubType extends SuperType{

        public SubType(ArrayList<GenericObject<Y>> g) {
            super(g);
        }
    }

    public class SuperType {

        public ArrayList<GenericObject<?>> data = new ArrayList<GenericObject<? extends X>>();

        public SuperType(ArrayList<GenericObject<? extends X>> series) {

            data.addAll(series);
        }
    }


    class GenericObject<T extends X>{}
    class X{};
    class Y extends X{};

我在调用super(g)时遇到错误。它说

  

构造函数   TestGenerics.SuperType(ArrayList的&GT)   未定义

这有点奇怪,因为我认为Generics允许这种事情。

如果我没有通过我的通用对象的ArrayList,只是传递通用对象,那就没问题了。

public class SubType extends SuperType{

    public SubType(GenericObject<Y> g) {
        super(g);
    }
}

public class SuperType {

    public ArrayList<GenericObject<?>> data = new ArrayList<GenericObject<? extends X>>();

    public SuperType(GenericObject<? extends X> series) {

        data.add(series);
    }
}

class GenericObject<T extends X>{
}

class X{};
class Y extends X{};

以上工作完美。有没有办法让第一个例子起作用?

2 个答案:

答案 0 :(得分:2)

即使ArrayList<Child>扩展ArrayList<Parent>,您的问题仍然是Child不会延伸Parent。 但是,您之前处于正确的轨道上,因为ArrayList<Child>确实扩展了ArrayList<? extends Parent>

您只需要再次重复? extends ...模式,就像这样:

public SuperType(ArrayList<? extends GenericObject<? extends X>> series) {
    data.addAll(series);
}

这对我来说很好。


更新:完整代码如下所示:

public class SubType extends SuperType{

    public SubType(ArrayList<GenericObject<Y>> g) {
        super(g);
    }
}

public class SuperType {

    public ArrayList<GenericObject<?>> data = new ArrayList<GenericObject<? extends X>>();

    public SuperType(ArrayList<? extends GenericObject<? extends X>> series) {

        data.addAll(series);
    }
}


class GenericObject<T extends X>{}
class X{};
class Y extends X{};

答案 1 :(得分:2)

您是否正在寻找此解决方案?

class SubType extends SuperType<Y> {

    public SubType(List<GenericObject<Y>> g) {
        super(g);
    }
}

class SuperType<T extends X> {

    public List<GenericObject<T>> data = new ArrayList<GenericObject<T>>();

    public SuperType(List<GenericObject<T>> series) {
        data.addAll(series);
    }
}

class GenericObject<T extends X>{}
class X{};
class Y extends X{};