这个问题可能很简单(我希望不是),但是我在一次采访中发现了。
通常,给定一个接口类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;


}
}

09-08 11:19