如何在java中给出Generics中的And条件

时间:2013-08-28 10:41:47

标签: java

我们有类A<-B<-C<-D<-E<-F的类结构(B扩展A,C扩展B等等。)

我需要创建一个方法acceptList(List<> list),使其可以接受ListA,C,E并且不接受B,D,F列表。

在接受采访时我问过这个问题。

4 个答案:

答案 0 :(得分:2)

这样的一些技巧可能会起作用,请记住接口总是会被反射...因此,如果你可以直接在接口中实现那些类型相关的函数,那就去做吧。

首先执行类:

public class A {

public boolean isAcceptable() {
    return true;
}

static class B extends A {

    @Override
    public boolean isAcceptable() {
        return !super.isAcceptable();
    }
}

static class C extends B {
    @Override
    public boolean isAcceptable() {
        return !super.isAcceptable();
    }
}

static class D extends C {
    @Override
    public boolean isAcceptable() {
        return !super.isAcceptable();
    }
}

static class E extends D {
    @Override
    public boolean isAcceptable() {
        return !super.isAcceptable();
    }
}

static class F extends E {
    @Override
    public boolean isAcceptable() {
        return !super.isAcceptable();
    }
}

}

然后你的acceptList(〜):

public static boolean acceptList(List<? extends A> list){
    for (A a : list) {
        if(!a.isAcceptable()){
            return false;
        }
    }
    return true;
}

答案 1 :(得分:1)

可能使用条件 - ifisInstance()

答案 2 :(得分:0)

不可能,您只能指定允许的类而不是不允许的类。

此外,一旦方法被定义为接受List<? extends A>,它接受​​List<A>List<B>List<C>,......

答案 3 :(得分:0)

泛型不允许区分。类型擦除将发挥其技巧..我建议你写一个如下所示的自定义逻辑:

public class Test {

public boolean accept(List<? extends A> list) {
    for (Object o : list) {
        if (o instanceof E && !(o instanceof F))
            return true;
        else if (o instanceof C && !(o instanceof D) && !(o instanceof F))
            return true;
        else if (o instanceof A && !(o instanceof B) && !(o instanceof D) && !(o instanceof F))
            return true;
        return false;
    }
    return false;

}

}

class A {

}

class B extends A {

}

class C extends B {

}

class D extends C {

}

class E extends D {

}

class F extends E {

}

测试上述代码的测试方法:

public static void main(String [] args){

    Test t = new Test();

    List<F> listF = new ArrayList<F>();
    listF.add(new F());
    System.out.println("List of F returns "+ t.accept(listF));

    List<E> listE = new ArrayList<E>();
    listE.add(new E());
    System.out.println("List of E returns "+ t.accept(listE));

    List<D> listD = new ArrayList<D>();
    listD.add(new D());
    System.out.println("List of D returns "+ t.accept(listD));

    List<C> listC = new ArrayList<C>();
    listC.add(new C());
    System.out.println("List of C returns "+ t.accept(listC));

    List<B> listB = new ArrayList<B>();
    listB.add(new B());
    System.out.println("List of B returns "+ t.accept(listB));

    List<A> listA = new ArrayList<A>();
    listA.add(new A());
    System.out.println("List of A returns "+ t.accept(listA));
}

测试结果:

List of F returns false
List of E returns true
List of D returns false
List of C returns true
List of B returns false
List of A returns true

修改

如果您想进行更多研究,这可能会对您有所帮助。 Get generic type of java.util.List