java - "Anoynmous methods"有趣的行为

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

因为对象没有为其定义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/

相关文章:

java - 在 Play 框架中使用 ElementCollection 时出现 LazyInitializationException

java - 在使用 googleapp 引擎时使用 apache commons 库

java - 升级到Gradle 7后如何将android库发布到本地目录

java - Char* 在 JNI 调用中损坏

java - 从 TableView 内的按钮列中删除行 [Java]

java - 将文件从目录复制到另一个,具有文件和目录的路径

java - 请求映射 - Spring 4 - 不起作用

java - 在 Android 中使用 OkHttp 客户端时 header 值中出现意外的字符 0x0a

java - 使用java编码的json字符串无法使用php解码

java - 在 Java 中创建默认构造函数