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

如何在Scala中扩展包含泛型方法的Java接口?

发布时间:2020-12-16 18:19:25 所属栏目:安全 来源:网络整理
导读:假设我们有以下 Java接口: // Javapublic interface Foo { T T bar(ClassT c);} 我应该如何在Scala中扩展它?写作 // Scalaclass FooString extends Foo { override def bar(c: Class[String]): String = "hello,world";} 将导致编译器抛出“类FooString需
假设我们有以下 Java接口:

// Java
public interface Foo {
    <T> T bar(Class<T> c);
}

我应该如何在Scala中扩展它?写作

// Scala
class FooString extends Foo {
  override def bar(c: Class[String]): String = "hello,world";
}

将导致编译器抛出“类FooString需要是抽象的,因为类型为[T](Class [T])T的特征Foo中的方法栏未定义.”

提前致谢!

更新:
丑陋的事实是:我误解了Java中的泛型.

在任何情况下,我的困境的解决方案都显示在尼古拉斯和沃尔特的答案中,尽管我更喜欢沃尔特的答案,因为它不那么冗长.

解决方法

这有效:

class FooString extends Foo {
  def bar[String](c: Class[String]): String = "hello world".asInstanceOf[String]
}

val fs = new FooString
println(fs.bar(classOf[String]))

编辑:

来自@Eastsun的评论是正确的.由于bar是类型参数为T的泛型方法,因此Scala中bar的实现也必须是通用方法.我认为在Scala中实现Foo的正确方法如下:

class FooString extends Foo {
  def bar[T](c: Class[T]): T = c.newInstance.asInstanceOf[T] // c gotta have a default constructor
}

val fs = new FooString
println(fs.bar(classOf[String]).getClass) // prints "class java.lang.String"
println(fs.bar(classOf[java.util.Date]).getClass) // prints "class java.util.Date"

(编辑:李大同)

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

    推荐文章
      热点阅读