如何在Scala中扩展包含泛型方法的Java接口? [英] How do I extend Java interface containing generic methods in Scala?
问题描述
假设我们有以下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屋!