这个问题可能很简单(我希望不是),但是我在一次采访中发现了。
通常,给定一个接口类IntClass,以及许多实现名为ImpIC1,ImpIC2,...,ImpICk的接口的类。 IntClass中的方法是名为void action1(),void action2()...,void actionM()的抽象公共方法。
我得到了一个公共类Test,它具有名为public static IntClass foo(IntClass c1,IntClass c2)的公共静态函数。此方法对c1和c2进行一些操作以创建InClass并返回。但是,该方法必须适用于IntClass的每个有效实现。问题主要在于c3的定义。我将如何设计方法foo()..
参见下面的代码详细信息:
public interface IntClass {
abstract void action1();
..
abstract void actionM();
}
..
public class ImpIC1 implements IntClass {
public void action1() { ... }
public void action2() { ....}
..
public void actionM() { ... }
}
...
public class ImpIC2 implements IntClass {
public void action1() { ... }
public void action2() { ....}
..
public void actionM() { ... }
}
...
public class ImpICk implements IntClass {
public void action1() { ... }
public void action2() { ....}
..
public void actionM() { ... }
}
...
public class Test {
public static IntClass foo(IntClass c1, IntClass c2) {
....
...
return c3;
}
}
...
问题主要在于c3的定义。我尝试了以下解决方案(均无效):
在foo内部,c3被定义为Object的实例。即IntClass c3 =(IntClass)new Object()。 -编译时错误对象无法转换为IntClass
在foo内部,c3没有初始化。 (编译时错误)。
在foo内部,c3为null,(null指针异常)
在foo内部,c3初始化为c3的实现之一(即c3 =(IntClass)new ImpIC1())..问题是,如果我们在外部ImpIC2中执行s =(ImpIC1)foo(c1,c2)-我们收到错误消息(无法投射)。
最佳答案
我不知道您的执行情况。但是这是我们需要知道的一些观点。
您不能实例化接口(匿名内部类除外)。如果要让Interface返回更改测试类,如下所示-
public class Test {
public static IntClass foo(IntClass c1, IntClass c2,String className) {
....
...
IntClass c3 = Class.forName(className);
//Set properties of c3 as your logic.
return c3;
}
}