我们有一个类结构,例如A<-B<-C<-D<-E<-F
( B 扩展 A,C 扩展 B 等等)。
我需要以acceptList(List<> list)
这样的方式创建一个方法,它可以接受List
ClassA,C,E
并且不接受 List of B,D,F
。
这个问题是在一次采访中问我的。
我们有一个类结构,例如A<-B<-C<-D<-E<-F
( B 扩展 A,C 扩展 B 等等)。
我需要以acceptList(List<> list)
这样的方式创建一个方法,它可以接受List
ClassA,C,E
并且不接受 List of B,D,F
。
这个问题是在一次采访中问我的。
像这样的一些技巧可能会起作用,请记住接口总是会击败反射......因此,如果您可以直接在接口中实现那些依赖于类型的函数,那么就去做吧。
首先你的类的实现:
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;
}
也许使用条件 -if
和isInstance()
?
不可能,您只能指定允许的类而不是不允许的类。
此外,一旦一个方法被定义为接受List<? extends A>
它接受的 a List<A>
,List<B>
, List<C>
,...
泛型不允许区分。类型擦除将发挥其作用..我建议您编写如下自定义逻辑:
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
编辑:
如果您想进行更多研究,这可能会对您有所帮助。获取 java.util.List 的泛型类型