在Scala中使用Java注释和Java接口实现
发布时间:2020-12-16 08:47:40 所属栏目:安全 来源:网络整理
导读:编辑:此问题似乎已从 Scala 2.9.1解决 给定以下现有Java库(简化): public interface IFaceT {}@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD})public @interface Anno { Class? extends IFace value();} 该库具有期望用户定义的接口的
编辑:此问题似乎已从
Scala 2.9.1解决
给定以下现有Java库(简化): public interface IFace<T> {} @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface Anno { Class<? extends IFace> value(); } 该库具有期望用户定义的接口的方法,该接口包含一个或多个使用@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注释的使用? 编辑:编译的原始Java版本的Usage,如下所示: public interface Usage { @Anno(Impl.class) String aMethod(); } 我正在尝试找到正确的语法来在Scala中说同样的事情. 解决方法
这是Scala不能与Java良好互操作的边缘情况之一.问题是声明为泛型的类型后来被用作原始类型:
public interface IFace<T> {} // ... Class<? extends IFace> value(); 在这种情况下最常用的解决方案 – 我建议你查询有关与Scala的原始类型交互的问题,因为Stack Overflow上还有其他类似的情况 – 是用Java编写一个包装器. 我不确定这是否可行,但您可能会尝试使用兼容类型签名扩展Anno覆盖值.也许缩小返回类型为Class<?扩展Impl>,或者只是重写它以在IFace中使用泛型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |