java - 在 Scala 中将 Java 注释与 Java 接口(interface)实现结合使用

标签 java scala

编辑:从 Scala 2.9.1 开始,这个问题似乎已经解决

给定以下现有 Java 库(已简化):

public interface IFace<T> {}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Anno {
    Class<? extends IFace> value();
}

该库的方法需要一个用户定义的接口(interface),该接口(interface)包含一个或多个用 @Anno 注释的方法。

我正在探索将现有代码从 Java 转换为 Scala。现有代码库包含 IFace 的实现:

public class Impl implements IFace<String> { }

我正在尝试创建一个可供库使用的 Scala 类:

trait Usage
{
    @Anno(classOf[Impl])
    def aMethod(): String
}

Scala 编译器拒绝这个:

$ scalac -explaintypes Usage.scala
Usage.scala:5: error: type mismatch;
 found   : java.lang.Class[Impl](classOf[Impl])
 required: java.lang.Class[_ <: IFace]
  @Anno(classOf[Impl])
               ^
java.lang.Class[Impl](classOf[Impl]) <: java.lang.Class[_ <: IFace]?
  java.lang.Class[Impl](classOf[Impl]) <: java.lang.Class[?0?0]?
    java.lang.Class[Impl] <: java.lang.Class[?0?0]?
      ?0?0 <: Impl?
      true
      Impl <: ?0?0?
      true
    true
  true
  Nothing <: Impl?
    <notype> <: Impl?
    false
  true
  Impl <: IFace?
  false
  java.lang.Class[Impl] <: java.lang.Class[_ <: IFace]?
    java.lang.Class[Impl] <: java.lang.Class[?0?0]?
      ?0?0 <: Impl?
      true
      Impl <: ?0?0?
      true
    true
    Nothing <: Impl?
      <notype> <: Impl?
      false
    true
    Impl <: IFace?
    false
  false
false
one error found

它似乎拒绝了代码,因为它不相信 Impl 扩展了 IFace。这是 Java/Scala 互操作性的限制,还是我需要在 Scala 中以不同方式指定我对 Java 注释的使用?

编辑: Usage 的原始 Java 版本编译后如下所示:

public interface Usage
{
    @Anno(Impl.class)
    String aMethod();
}

我正试图找到正确的语法来在 Scala 中表达同样的事情。

最佳答案

示例在将通配符添加到 Anno 定义后编译:

Class<? extends IFace<?>> value();

我可以假设编译器不会像对待 IFace[_] 那样对待 IFace 并且不相信 IFace[String] (因此 Impl) 扩展了 IFace

关于java - 在 Scala 中将 Java 注释与 Java 接口(interface)实现结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6644265/

相关文章:

scala - 如何将 Dataset[(String, Seq[String])] 转换为 Dataset[(String, String)]?

java - 覆盖字段初始化

java - 如何使用java对HTTPS请求进行授权?

scala - 单个 RDD 记录可以有多大?

Scala 相当于 Haskell 的 where 子句?

scala - 判断案例类的字段是否为案例类

scala - 案例类副本不维护继承特征的状态

java - 计算偶整数总和的更好方法

java - 如何用Java设计http压力测试器

java - 导入oracle.jdbc无法解决