繁体   English   中英

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

[英]Trying to sub-type classes using generics

我在尝试创建子类型类并用某个通用类型的对象的ArrayList调用其超构造函数时遇到问题。 我正在尝试使此代码正常工作。 我希望我的子类型仅接受类型XGenericObjects列表。

    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>)未定义

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

如果我不传递通用对象的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{};

以上完美地工作。 有什么方法可以使第一个示例生效?

您的问题是,即使Child扩展ParentArrayList<Child>也不会扩展ArrayList<Parent> 但是,您之前走在正确的轨道上,因为ArrayList<Child>确实扩展了ArrayList<? extends Parent> ArrayList<? extends Parent>

您只需要重复您的? extends ... ? 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{};

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

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{};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM