【问题标题】:How to call java method taking parameter as List<Class<?>> from Scala如何从Scala调用将参数作为List<Class<?>>的java方法
【发布时间】:2019-08-14 16:15:35
【问题描述】:

我正在尝试调用从 scala 获取 List&lt;Class&lt;?&gt;&gt;java 方法。

编译失败

type mismatch;
 found   : java.util.List[Class[T]] where type T <: Person.type
 required: java.util.List[Class[_]]

我尝试使用 JavaConverters,但得到了同样的错误。

Java 方法:

void registerClasses(List<Class<?>> var1);

从 Scala 调用:

def registerEntities() = registry.registerClasses(List(Person.getClass).asJava)

【问题讨论】:

  • 不是一个解决方案,但是当您将 Java 端更改为使用原始类型时会发生什么,所以只需 List var1)?
  • @GhostCat - Java 端是第三方库。所以,不能真正改变它。

标签: java scala generics


【解决方案1】:

问题是Person.getClass 的推断类型不是您想要的类型。您需要指定预期的类型,这可以通过显式类型参数来完成

registry.registerClasses(List[Class[_]](Person.getClass).asJava)

(我不明白为什么类型归属在这里不起作用:

registerClasses(List(Person.getClass: Class[_]).asJava)

type mismatch;
 found   : java.util.List[Class[_$2]] where type _$2
 required: java.util.List[Class[_]]
Note: Class[_$2] <: Class[_], but Java-defined trait List is invariant in type E.
You may wish to investigate a wildcard type such as `_ <: Class[_]`. (SLS 3.2.10)

据我所知应该。)

【讨论】:

  • 我无法使类型归属起作用,但似乎类型参数有效,所以 +1。
  • @Alexey Romanov - 谢谢。类型参数有效。但是,这让我感到困惑,为什么隐式转换没有。 IntelliJ 不抱怨,但 maven 编译失败。
猜你喜欢
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
相关资源
最近更新 更多