java 您所在的位置:网站首页 java调用函数方法 java

java

2023-03-25 04:27| 来源: 网络整理| 查看: 265

我有一个方法foo

void foo (String x) { ... } void foo (Integer x) { ... }

我想从不关心参数的方法中调用它:

void bar (Iterable i) { ... for (Object x : i) foo(x); // this is the only time i is used ... }

上面的代码抱怨foo(Object)没有定义,当我添加时

void foo (Object x) { throw new Exception; }

然后bar(Iterable< String>)而不是foo(String)调用它并引发异常.

如何避免对bar(Iterable< String>)和bar(Iterable< Integer>)具有两个文本上相同的定义?

我以为我可以摆脱像

void bar (Iterable i) { ... for (T x : i) foo(x); // this is the only time i is used ... }

但后来我找不到foo(T)错误.

解决方法:

您面临的问题是重载方法在编译时绑定.在您的示例中,编译器尝试找出要调用的foo()方法.但是,示例中x的最强静态类型是Object,并且没有方法foo(Object),因此编译器表示无法调用适当的方法.

如果添加foo(Object)方法,则无论x的实际运行时类型是什么,都将始终调用foo(Object)方法.

此问题扩展到使用泛型.由于T可以是任何类型,因此您必须具有通用方法foo(T)否则您的代码将无法编译.但是,如果添加该方法,则会失去区分这些参数类型的能力,因为将仅调用foo(T).

解决此问题的唯一方法是逐案检查并像其他提出的答案一样进行转换.除非参数类型是您定义的类,否则它们都可以实现一个通用接口.然后,您可以执行以下操作:

interface ArgumentType { void callback(FooClass c); } class YourClassA implements ArgumentType { void callback( FooClass c ) { c.foo( this ); } }

对于每个ArgumentType实现类,FooClass仍然必须具有foo()方法,但是通过这种方式,您可以通过不可知类型来进行选择.

以上是互联网集市为您收集整理的java-如何从不可知函数调用多态函数?全部内容,希望文章能够帮你解决java-如何从不可知函数调用多态函数?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有