我们有类A<-B<-C<-D<-E<-F
的类结构(B扩展A,C扩展B等等。)
我需要创建一个方法acceptList(List<> list)
,使其可以接受List
类A,C,E
并且不接受B,D,F
列表。
在接受采访时我问过这个问题。
答案 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)
可能使用条件 - if
和isInstance()
?
答案 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