加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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中使用泛型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读