簡體   English   中英

Java泛型擴展循環

[英]Java Generics extends Loop

我如何遍歷從類擴展的對象? 我舉一個例子:我有一個Abstract類(AbstractDTO)和2個擴展AbstractDTO的類:

public abstract class AbstractDTO
{
    private int id;

    /**
     * @return the id
     */
    public int getId()
    {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(int id)
    {
        this.id = id;
    }
}


public class FirstDTO extends AbstractDTO
{

}

public class SecondDTO extends AbstractDTO
{

}

現在,我有了一種可以擴展2對象集合的方法,該對象集合擴展了AbstractDTO。 我想將第二個列表中的所有對象添加到第一個列表中,如果它們不在第一個列表中。 我怎樣才能做到這一點?

我嘗試了以下方法:

public static void summarizeCollection(List<? extends AbstractDTO> firstList, Set<? extends AbstractDTO> secondList)
    {
        for(AbstractDTO second : secondList)
        {
            boolean exists = false;
            for (AbstractDTO first : firstList)
            {
                if (second.getId() == first.getId())
                {
                    exists = true;
                }
            }
            if(!exists)
            {
                firstList.add(second);
            }
        }

    }

我在“ firstList.add(second);”行中出錯。 因為我的第二個對象是AbstractDTO類型,而不是擴展AbstractDTO的類。

有人可以幫我嗎? 多謝 ;)

編譯器不能肯定的是,在元素secondList都是同一類型中聲明的元素的firstList ,所以你在這里得到一個編譯錯誤:

firstList.add(second);

這是由於參數的定義引起的:

List<? extends AbstractDTO> firstList, Set<? extends AbstractDTO> secondList

如果您確定ListSet屬於同一類型,並且此類型擴展了AbstractDTO ,則可以這樣聲明您的方法:

public static <T extends AbstractDTO> void summarizeCollection(List<T> firstList, Set<T> secondList)

然后,在方法內部,將其更改for循環:

for(AbstractDTO second : secondList)

進入

for(T second : secondList)

等等。

更多信息:

出現編譯器錯誤是因為編譯器無法保證List中的通配符等於Set的通配符。

您可以通過使方法通用來解決此問題。 您需要一個類型變量來表示List的類型,它必須是AbstractDTO ,例如T 您可以將Set為以T為邊界的通配符,以便任何類型為T或擴展TSet都可以將其元素添加到List

public static <T extends AbstractDTO> void summarizeCollection(
    List<T> firstList, Set<? extends T> secondList)

然后,兩個for循環的變量都應為T類型。

for(T second : secondList)

    for (T first : firstList)

這將允許調用add進行編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM