“匿名方法”有趣的行为

时间:2013-06-04 09:42:21

标签: java

我开始使用这段代码,但没有编译:

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());

因为Object没有为其定义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)吗?

提前致谢。

2 个答案:

答案 0 :(得分:5)

Java没有"扔掉"方法;你放入该数组的实例拥有它,但Java的类型系统没有任何功能可以使它们可用于外部代码。

例如,您可以通过反射来验证方法是否存在。

如果您想为匿名类提供更多方法,请定义适当的接口并使用new MyInterface() { ... }

答案 1 :(得分:1)

这就是所谓的匿名类

您定义了一个匿名类

new Object() { public String compute() {return "yay 1!";} }

之后你无法使用。

如果您已宣布

class Child { // extends Object {

  public String compute() {return "yay 1!";}

}

然后你就可以完成了

for (Object o : obj)
    System.out.println(((Child)o).compute());