簡體   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