【问题标题】:Matlab java interop. Use enum valuesMatlab java互操作。使用枚举值
【发布时间】:2023-03-31 07:07:01
【问题描述】:

我有 java 枚举

package com.moc;
public enum MyType {
    s,
    q,
    p,
    none,
}

在 matlab(2012a) 中我加载适当的 jar,并设置

a = com.moc.MyType.q;
a = com.moc.MyType.none;

它也有效。但是当我尝试评估时

a = com.moc.MyType.s;

a = com.moc.MyType.p;

我遇到了异常

The class com.moc.MyType has no property or method named 's'.

The class com.moc.MyType has no property or method named 'p'.

为什么 matlab 不允许我获取 's' 和 'p' 枚举值?

附:

a = com.moc.MyType.q;
a.getClass.getDeclaredField('p')

返回

public static final com.moc.MyType com.moc.MyType.p

更新

com.moc.MyType.valueOf('p') 有效。但问题对我来说仍然很重要。

【问题讨论】:

    标签: java matlab


    【解决方案1】:

    正如this answer 中列出的那样,您可能需要稍微不同地引用它。有时 Java 将内容存储为 $ 而不是 .,因此如果您按照下面列出的方式进行调用,它应该可以工作。

    javaObject('com.moc.MyType$q')
    

    【讨论】:

    • 谢谢。但是为什么“com.moc.MyType.q”有效而“com.moc.MyType.p”无效?
    • 我不确定,但我怀疑它与第一个枚举值有关。出于同样的原因,最后一个也可能起作用,但中间的所有东西都不起作用。
    【解决方案2】:

    嗯,这应该可以。我只是在猜测,但您可以尝试使用大写枚举常量(例如 com.moc.MyType.P)吗?也许有一些草率的东西依赖于约定。

    【讨论】:

      【解决方案3】:

      我真的怀疑这是一个配置错误。 (我以前称之为 makefile 错误)。也就是说,我怀疑您实际加载到 Matlab 中的代码没有链接到您正在编写的 Java 代码,而是一个较旧的版本。

      要确认/驳斥此类错误,请尽可能进行最小的更改,这些更改将在您执行时可见。例如,将q 更改为qq 并确认a = com.moc.MyType.qq; 在Matlab 中有效。

      如果它确实有效,那我就错了。 如果没有,那么您需要通过编译/jar'ing/加载过程来查看您在哪里有一个陈旧的文件。

      【讨论】:

      • 谢谢。但为什么“com.moc.MyType.q”有效而“com.moc.MyType.p”无效?
      猜你喜欢
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2018-03-16
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      相关资源
      最近更新 更多