繁体   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