【问题标题】:How to avoid ambiguity when calling Java from Matlab?从 Matlab 调用 Java 时如何避免歧义?
【发布时间】:2009-03-17 21:06:07
【问题描述】:

我刚从 Matlab 调用 Java 时发现

object.method(arg1,...,argn)

等价于

method(object, arg1,...,argn)

这里的问题是我还有一个method.m,它可以将Java 转换为Matlab(例如,将String[] 转换为字符串单元)。我的method.m 看起来像

function result = method(object, arg1,...argn)
  intermediate = object.method(arg1,...argn);
  result = translate(intermediate);

发生的事情是当我调用 method(object, arg1,...,argn) 时,它会直接调用 Java,而不是使用我的 method.m

修复很简单,只是不要对我的 Java 方法和 .m 文件使用相同的方法名称。 但是还有其他方法吗?我怎么知道在给定相同名称的情况下会调用哪个方法?有没有办法确保我调用 method.m 而不是 Java 方法? 确保调用 Java 方法很容易,只需使用 object.method 语法。

附带说明一下,.m 编辑器在 method(object, arg1,...,argn) 调用上链接到 method.m 也是愚蠢的,而在调试时它会调用 Java 方法。

【问题讨论】:

  • 我只是通过在我的 .m 文件中添加前缀来解决它,我没想到会找到解决这个问题的好方法,我只是看看是否有任何答案

标签: java matlab methods ambiguity


【解决方案1】:

您可能会在 MATLAB 的调度方式上遇到一些问题...

我如何知道同名的方法会被调用?

This section MATLAB 文档讨论了在有多个同名函数的情况下如何选择函数。来自文档:“函数优先顺序根据函数的类型及其在 MATLAB 路径上的位置确定一个函数相对于另一个函数的优先级。”这个顺序(从高到低)如下:

  • 子函数
  • 私人函数
  • 类构造函数
  • 重载方法
  • 当前目录中的函数
  • 路径上其他地方的功能

“method.m”函数的位置可能会决定在使用“method(object,...)”语法时是调用它还是调用 Java 方法。

有没有办法确保我调用的是 method.m 而不是 Java 方法?

现在,我猜您的“method.m”位于当前目录或路径上的其他位置(两个最低优先级位置)。如果您在调用它的较大代码中将“method.m”设置为subfunction,或者如果可以将它放在private directory 中,每个需要调用它的函数都可以调用它,那么它可能会被调用当您使用“method(object,...)”语法时,而不是 Java 方法。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    Hmmmmmmmmmm....您可以尝试使用@method 获取函数句柄,然后在函数句柄上调用feval()

    这可能有效,但我不确定....

    【讨论】:

    • 我感觉函数优先顺序仍然适用于获取函数的句柄(即句柄可能仍然指向 Java 方法,而不是 OP 重载的 method.m)。不过我不完全确定。
    • 我检查了文档 (mathworks.com/access/helpdesk/help/techdoc/ref/…)...“当您通过句柄评估重载函数时,评估句柄的参数决定了 MATLAB 调度到的实际函数。”该死的,墨菲! =)
    猜你喜欢
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多