当前位置: 首页 > 面试题库 >

使用匿名接口的任意定义方法

冉丰茂
2023-03-14
问题内容

考虑以下代码:

public static void main(String[] args) {
    File file = new File("C:\\someFile.txt") {
        public void doStuff() {
            // Do some stuff
        }   
    };

    file.doStuff(); // "Cannot resolve method"
}

当我们尝试调用新定义的方法时doStuff(),这是不可能的。这样做的原因是,它file被声明为类型的对象File而不是我们新的匿名子类的实例。

因此,我的问题是,是否有任何“不错”的方式来实现这种行为?除了显而易见的(正确地声明类)。


问题答案:

这是不可能的,因为您试图在超类引用上调用方法子类。而且该方法未在超类本身中定义。匿名类只是File那里的一个子类。

但是,一种解决方法是进行反思:

file.getClass().getMethod("doStuff").invoke(file);

getClass()方法将返回的运行时类型file,然后您可以使用Class#getMethod()method
获得该类的方法。

好吧,我本人也不喜欢反思。当然,更好的方法是通过扩展超级类来创建类,如果您要进行此类操作。使用反射轻松解决问题,使用简单的修改即可轻松完成,这真是让人头疼。



 类似资料:
  • 问题内容: 我已经阅读了“ C#匿名实现接口(或抽象类) ”线程以匿名实现接口。但是我想知道使用委托或任何类似方法的.NET 2.0(NO LINQ)是否也可能实现 我从JAVA知道以下可能: (我希望我还记得,是一段时间以前我使用JAVA,但我想它是类似的东西)。每当方法需要接口的实例并且仅被调用一次时,这可能会有所帮助,因此无需为此单一方法创建新的类。 问题答案: .NET 2.0还支持匿名委

  • 问题内容: 因此,当研究lambda表达式并用它们代替Java中的EventHandlers的匿名内部类时,我遇到了一些匿名内部类,这些使我停下来思考。例如,当为通常实现ActionListener的东西编写匿名内部类时,我们会编写 我对此感到困惑,因为ActionListener是一个接口,所以我认为有必要做类似的事情… 但这甚至无法编译。我想我这样做的原因显然是如果我们使用私有内部类,而使用

  • VOLUME 定义匿名卷 格式为: VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径> 之前我们说过,容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,后面的章节我们会进一步介绍 Docker 卷的概念。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以

  • 问题内容: 包: struct中的匿名接口是什么意思? 问题答案: 通过这种方式,反向实现了,我们可以覆盖特定的方法而不必定义所有其他方法 请注意,这里是如何交换而不是交换的,这也是为struct声明的唯一方法,即使实现 无论此方法内部传递了什么结构,我们都会将其转换为新的结构。 真正的价值在于,如果您认为如果无法采用这种方法,该怎么办。 向吗?添加另一种方法? 创建另一个ReverseInter

  • 本文向大家介绍common-lisp 定义匿名函数,包括了common-lisp 定义匿名函数的使用技巧和注意事项,需要的朋友参考一下 示例 Common Lisp中的函数是一等值。可以使用创建匿名函数lambda。例如,这是3个参数的函数,然后我们使用调用funcall 匿名函数也可以直接使用。Common Lisp为此提供了一种语法。 匿名函数也可以存储为全局函数: 带引号的lambda表达式

  • 问题内容: 我已经看到了几个与Java中类似的示例,希望有人可以解释发生了什么。似乎可以内联定义一个新类,这对我来说真的很奇怪。 第一行是预期的输出行,因为它只是toString。但是第二似乎函数可以内联重写。 为此有技术术语吗? 还是任何更深入的文档? 如果我有以下代码: 代码输出: 问题答案: 它是一个匿名内部类。您可以在Java文档内部类链接中找到有关它的更多信息。 编辑 我正在添加一个更好