如何在Scala中实现含无泛型参数Scala数组的Java接口?
在Scala中实现带raw type数组参数的Java接口
没问题,完全可以在Scala里实现这个Java接口!你遇到的报错是因为Java的raw type(不带泛型参数的scala.Array)和Scala的泛型系统交互时需要特殊处理。
问题根源
你的Java接口里定义的bar(scala.Array arr)使用了raw type(没有指定泛型参数),而Scala是强类型泛型语言,直接用Array[_]虽然接近正确,但编译器需要明确的类型匹配提示。
正确的实现方式
有两种可行的写法:
写法一:使用通配符类型Array[_]
这是编译器报错提示里推荐的方式,直接用通配符匹配Java的raw type:
class FooImpl extends Foo { override def bar(arr: Array[_]): Unit = { // 在这里编写你的业务逻辑,比如遍历数组元素 arr.foreach(item => println(s"元素:$item")) } }
写法二:使用Array[Any]
如果通配符写法还是有问题,可以用Array[Any]——因为Java的raw type本质上是擦除了泛型,对应Scala的Any类型:
class FooImpl extends Foo { override def bar(arr: Array[Any]): Unit = { // 实现逻辑示例 if (arr.nonEmpty) println(s"数组第一个元素:${arr(0)}") } }
为什么你的原代码报错?
编译器提示“Array does not match Array[_]”,是因为Java的raw type scala.Array在Scala中被解析为不带泛型的Array(Scala语法里不允许直接写无泛型的Array),而Array[_]是Scala的存在类型,编译器需要确认这个类型映射关系。上面两种写法都能让编译器正确识别你要实现的是Java接口的raw type方法。
内容的提问来源于stack exchange,提问作者OmriManor
相关产品推荐
相关产品推荐

