如何从Java类调用Scala隐式类方法

如何从Java类调用Scala隐式类方法,java,scala,scala-java-interop,language-interoperability,Java,Scala,Scala Java Interop,Language Interoperability,我是一名在混合Java/Scala代码库中工作的初级程序员。我在Scala中有一个隐式类,它为第三方依赖项中的类提供扩展。隐式类如下所示: object ThirdPartyClassOps { implicit class ThirdPartyClassOps(val tp: ThirdPartyClass) extends AnyVal { ... def generateKey(): String = { tp.getId + "-" + tp.getOth

我是一名在混合Java/Scala代码库中工作的初级程序员。我在Scala中有一个隐式类,它为第三方依赖项中的类提供扩展。隐式类如下所示:

object ThirdPartyClassOps {
  implicit class ThirdPartyClassOps(val tp: ThirdPartyClass) extends AnyVal {
    ...
    def generateKey(): String = {
      tp.getId + "-" + tp.getOtherString
    }
  }
}

public class MyJavaClass {
  ...
  public static boolean thirdPartyClassIsValid(ThirdPartyClass tp) {
    ...
    // Generate tp key here.

  }

}
其中,
generateKey
是我感兴趣的方法。我想调用
generateKey
的Java类如下:

object ThirdPartyClassOps {
  implicit class ThirdPartyClassOps(val tp: ThirdPartyClass) extends AnyVal {
    ...
    def generateKey(): String = {
      tp.getId + "-" + tp.getOtherString
    }
  }
}

public class MyJavaClass {
  ...
  public static boolean thirdPartyClassIsValid(ThirdPartyClass tp) {
    ...
    // Generate tp key here.

  }

}
我的初学者对JVM语言的理解表明,我应该可以从Java类中调用
generateKey
。搜索答案让我找到了一些例子,比如调用上述Scala方法有一个简单的解决方案。当我尝试使用
String myKey=ThirdPartyClassOps.ThirdPartyClassOps(tp.generateKey())调用它时
字符串myKey=ThirdPartyClassOps$.MODULE$.ThirdPartyClassOps(tp.generateKey()根据StackOverflow答案和IntelliJ的自动建议,我在尝试构建时遇到了“错误:找不到符号”错误:

.../MyJavaClass.java:33: error: cannot find symbol
             String myKey = ThirdPartyClassOps$.MODULE$.ThirdPartyClassOps(tp).generateKey();
                                                                              ^
   symbol:   method generateKey()
   location: class ThirdPartyClass

考虑到Scala中的隐式类定义,如何在Java类中调用隐式类方法?

如果您有一个混合项目,通常建议编写Java接口,并坚持使用该接口进行互操作,请尝试
新建ThirdPartyClassOps$.ThirdPartyClassOps(tp).generateKey()。您将失去大部分scala功能,但实际上,如果将其与java混合使用,您已经失去了这些功能。如果您有一个混合项目,并且常见的建议是编写java接口并在互操作中坚持使用它,请尝试
new ThirdPartyClassOps$.ThirdPartyClassOps(tp).generateKey()
。您将失去大部分scala特性,但实际上,由于将其与java混合,您已经失去了这些特性。