编辑:从 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/