0

我从这段代码开始,它没有编译:

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

我的问题是如何告诉 javacompute()存在?

如果无法做到这一点,我是否可以像在第一个示例中那样覆盖对象确实存在的方法?实际代表的方法compute()是一个采用int. 这可能很可怕,但我应该覆盖wait(long l)吗?

提前致谢。

4

2 回答 2

5

Java 并没有“丢弃”该方法;您放入该数组的实例拥有它,但 Java 的类型系统没有使它们可用于外部代码的功能。

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

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

于 2013-06-04T09:44:46.623 回答
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());
于 2013-06-04T09:51:15.450 回答