我开始使用这段代码,但没有编译:
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)
吗?
提前致谢。
答案 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());