防止父类成为可接受类型的泛型



在这种情况下,我必须创建一个通用方法,该方法可以接受子对象列表,但不能接受父类对象。

假设我有

class ClassA {}

正在扩展

class ClassB extends ClassA {}
class ClassC extends ClassA {}
executeMethod(List</* either ClassB or ClassC but not ClassA */>)

我们能用泛型实现吗?

我不知道为什么你不能只允许List<? extends ClassA>,但你可以尝试:

<T Extends ClassA> void executeMethod(List<? extends T>);
//not sure if this will work but worth a try.

public interface ClassX {}
public class ClassA {
    void executeMethod(List<? extends ClassX);
}
public ClassB extends ClassA implements ClassX {}
public ClassC extends ClassA implements ClassX {}

制作抽象是最简单的方法。如果你不能制作抽象,你可以创建一个扩展A的抽象类,然后由B和C扩展,例如:

class A {
}
abstract class X extends A {
}
class B extends X {
}
class C extends X {
}
public void executeMethod(List<? extends X> list) {
}

这是不能完成的,因为Pshemo说对此没有ornot操作。然而,你可以这样做:

public static void executeMethod(List<ClassB> list){ 
    sharedMethodPerhaps( ... );
}
public static void executeMethod(ArrayList<ClassC> list){
    sharedMethodPerhaps( ... );
}
private static void sharedMethodPerhaps( ... ){ 
    ...
}

这样就有了两个同名的方法,一个只接受包含ClassB对象的列表,另一个只接收包含ClassC对象的列表。并且由于CCD_ 6和CCD_。sharedMethodPerhaps是私有的,所以您可以控制它是什么代码类以及如何实现。

我希望这能有所帮助:)

最新更新