[英]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
如果您確定List
和Set
屬於同一類型,並且此類型擴展了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
或擴展T
的Set
都可以將其元素添加到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.