我试图用java包围我的想法.当我将一个对象传递给另一个类的方法时,我不能只调用该对象类固有的任何方法吗?
以下示例中的代码无法编译的原因是什么?
谢谢,
class a { public static void myMethod(Object myObj) { myObj.testing(); } } class b { public void testing() { System.out.println ("TESTING!!!"); } } class c { public static void main (String[] args) { b myB = new b(); a.myMethod(myB); } }
编辑:我将myMethod中的参数保留为Object类型的原因是因为我希望能够传递各种对象类型,每种类型都有一个testing()方法.
如果您想使用testing()
方法传递各种对象,请让每个对象实现一个Testable
接口:
public interface Testable { public void testing() }
然后myMethod()
拿一个Testable
.
public static void myMethod(Testable testable) { testable.testing(); }
编辑:为了澄清,实现一个接口意味着该类保证具有该方法,但该方法可以做任何想做的事情.所以我可以有两个类,其testing()
方法做不同的事情.
public class AClass implements Testable { public void testing() { System.out.println("Hello world"); } } public class BClass implements Testable { public void testing() { System.out.println("Hello underworld"); } }
问题是,在实际运行之前,myMethod
无法知道它正在获取b
对象.你String
知道,你可以传入一个in.
将其更改为
public static void myMethod(b myObj) { myObj.testing(); }
它应该工作.
更新问题:
编辑:我将myMethod中的参数保留为Object类型的原因是因为我希望能够传递各种对象类型,每种类型都有一个testing()方法.
正如Amanda S和其他几位人士所说,这是一个完美的界面案例.执行此操作的testing()
方法是创建一个定义方法的接口,并更改myMethod
为实现该接口的对象.
另一种解决方案(没有接口)将反射性地发现对象是否有testing()
方法并调用它,但不建议这样做,并且对于这样一个简单的情况不需要.
你在说什么是鸭子打字.Java没有鸭子打字.
因此,您需要定义一个具有testing()
方法的所有类的接口.
例如:
public interface Testable { public void testing() } class B implements Testable { public void testing() { System.out.println ("TESTING!!!"); } } class A { public static void myMethod(Testable myObj) { myObj.testing(); } }