Java 如何检查列表是否<;E>;满足其他列表的要求<;E>;

Java 如何检查列表是否<;E>;满足其他列表的要求<;E>;,java,Java,有没有办法检查一个列表是否符合另一个列表的要求?我有一个列表源和一个列表目标。这些类型还不知道,这就是为什么它们是泛型的。我试图找到一种方法,它可以检查源中的元素是否与目标类型匹配。如果是这样,那么元素将被添加到目标 public interface UnaryPredicate<E> { public List<E> copyIf( List<E> source,List<E> destination); } 公共接口一元谓词{ 公共列表c

有没有办法检查一个列表是否符合另一个列表的要求?我有一个列表源和一个列表目标。这些类型还不知道,这就是为什么它们是泛型的。我试图找到一种方法,它可以检查源中的元素是否与目标类型匹配。如果是这样,那么元素将被添加到目标

public interface UnaryPredicate<E> {

public List<E> copyIf( List<E> source,List<E> destination);

}
公共接口一元谓词{
公共列表copyIf(列表来源、列表目的地);
}

public类Copy实现一元谓词{
公共列表copyIf(列表源、列表目标)
{                                   
对于(列表温度:源)
{
//如果来源符合要求,
目的地。添加(临时);
}
}
公共静态void main(字符串[]args)
{
}

}我认为您可能希望在编译时通过将泛型接口定义为所有元素的父级来保证这一点,比如说它被称为IBaseElement;然后

List<E extends IBaseElement>
列表

这里有一种可能的方法,使用-


不清楚你到底想要什么。您希望在每个元素的基础上完成此操作,还是只是比较列表的类型?是否可以在编译时使用稍微复杂一点的泛型?这样做的目的是什么?具体来说,你想做什么

首先,在编写代码时,将传入两个独立的
E
类型列表。由于它们具有相同的类型,因此将在编译时验证它们,并且它们是兼容的。然而,您可能希望它们是不同的类型,在这种情况下,事情会变得更加复杂

如果您是基于每个元素进行检查,或者如果检查必须在运行时动态执行,那么由于Java的类型擦除,如果没有一些额外的工作,就无法完成这项工作。您可以传入元素必须兼容的类,如下所示:

public List<E> copyIf(Class<E> compatible, List<?> source, List<?> destination);
公共列表copyIf(类兼容、列表源、列表目标);
然后您可以逐个元素进行比较

另一方面,如果您只需要确保列表兼容,只需让编译器完成以下工作:

public List<E> copyIf(List<? extends E> source, List<E> destination);

public List copyIf(List您所做的已经保证了编译时的源列表和目标列表。如果您想传递任何类型的源列表,并在目标允许的类型下进行复制,则需要为此目的以类的形式传递一个额外的参数,因为Java中的泛型是基于擦除的,并且您不能对他在运行时输入参数

简言之:

public List<E> copyIf( List<?> source, List<E> destination, Class<E> destinationType) {
    for (Object o : source) {
        if (destinationType.isInstance(o) {
            ....
        }
    }
}
而且,您应该允许更灵活的目的地,以便您的代码可以用于更合理的场景:

public List<E> copyIf( List<?> source, 
                       List<? super E> destination, 
                       Class<E> destinationType) { ....
public List copyIf(列表源、,
列表
public List<E> copyIf(List<? extends E> source, List<E> destination);
public List<E> copyIf( List<?> source, List<E> destination, Class<E> destinationType) {
    for (Object o : source) {
        if (destinationType.isInstance(o) {
            ....
        }
    }
}
copyIf(anyList, destList, DestinationType.class);
public List<E> copyIf( List<?> source, 
                       List<? super E> destination, 
                       Class<E> destinationType) { ....