如何在Scala中扩展包含泛型方法的Java接口? [英] How do I extend Java interface containing generic methods in Scala?

查看:94
本文介绍了如何在Scala中扩展包含泛型方法的Java接口?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们有以下Java接口:

pre $ Java
public interface Foo {
< T> T栏(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中的泛型。



无论如何,Nicolas'和Walter的答案都显示了我的困境的解决方案,尽管我更喜欢Walter的答案'因为它不那么冗长。



  class FooString extends Foo {$ b $ class =h2_lin>解决方案

b 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的正确方法如下:
$ b $ pre $ class FooString extends Foo {
def bar [ T](c:Class [T]):T = c.newInstance.asInstanceOf [T] // c得到一个默认的构造函数
}

val fs = new FooString
println(fs.bar(classOf [String])。getClass)//打印class java.lang.String
println(fs.bar(classOf [java.util.Date])。getClass)//打印类java.util.Date


Suppose we have the following Java interface:

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

How should I extend it in Scala? Writing

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

will cause the compiler to throw "class FooString needs to be abstract, since method bar in trait Foo of type [T](Class[T])T is not defined."

Thanks in advance!

Update: The ugly truth is: I've misunderstood generics in Java.

In any case, the solutions to my woes are shown in both Nicolas' and Walter's answers, although I prefer Walter's answer better 'cos it's less verbose.

解决方案

This works:

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

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

Edited:

The comments from @Eastsun is correct. Since bar is a generic method with type parameter T, the implementation of bar in Scala has to be a generic method as well. I think the right way to implement Foo in Scala is the following:

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"

这篇关于如何在Scala中扩展包含泛型方法的Java接口?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆