我从这段代码开始,但它没有编译:
Object[] obj= new Object[2];
obj[0]=new Object () { public String compute() {return "yay 1!";} };
obj[1]=new Object () { public String compute() {return "yay 2!";} };
for (Object o : obj)
System.out.println(o.compute());
因为对象没有为其定义compute()
方法。所以,我假设java抛弃了这个函数;但是,以下方法确实有效:
Object[] obj= new Object[2];
obj[0]=new Object () { public String toString() {return "yay 1!";} };
obj[1]=new Object () { public String toString() {return "yay 2!";} };
for (Object o : obj)
System.out.println(o);
那么,java 一定仍然在某个地方存储了函数定义,对吧?或者这是因为我重写了 toString() ?
我的问题是如何告诉 java compute()
存在?
如果不可能做到这一点,我可以做一些事情,比如重写对象确实存在的方法,就像我在第一个示例中所做的那样? compute()
实际代表的方法是采用 int
的方法。这可能很糟糕,但我应该重写 wait(long l)
吗?
提前致谢。
最佳答案
Java并没有“抛弃”方法;您放入该数组的实例拥有它,但 Java 的类型系统没有使它们可供外部代码使用的功能。
例如,您可以通过反射来验证方法是否存在。
如果您想要为匿名类提供更多方法,请定义适当的接口(interface)并使用 new MyInterface() { ... }
。
关于java - "Anoynmous methods"有趣的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914532/