return class 在 Scala 中扩展通用特征
return class extending generic trait in Scala
Scala 代码:
trait Converter[S, T] {
def convert(source: S): T
}
class StringDuplicatorConverter extends Converter[Integer, String] {
override def convert(source: Integer): String = {
source.toString + source.toString
}
}
// whatever, the point is to show potentially many 'converters'
// from Integer (for example) to something
class SomeOtherConverter extends Converter[Integer, User] {
override def convert(source: Integer): User = {
User(source)
}
}
trait ConverterProvider {
def getConverter[N]: Converter[Integer, N]
}
class MyClass extends ConverterProvider {
override def getConverter[N]: Converter[Integer, N] = {
new StringDuplicatorConverter()
}
}
给予
Error:(17, 5) type mismatch;
found : StringDuplicatorConverter
required: Converter[Integer,N]
new StringDuplicatorConverter()
是的。对 getConverter[N]
的调用应该是 return 类型 Converter[Integer,N]
的东西,但 StringDuplicatorConverter
是类型 Converter[Integer,String]
。由于 N
不限于 String
,因此它们是不同的类型,因此无法编译。
如果编译器得到一些保证 N
是 String
的一个或超类型,那么它就可以工作。这可以通过使 return 类型协变来完成...
trait Converter[S, +T] { ...
... 然后定义 getConverter
和覆盖,如下所示:
def getConverter[N >: String]: Converter[Integer, N]
现在编译成功了。
val mc = new MyClass
mc.getConverter.convert(7) // res0: String = 77
可能您真正想要的是为每个 ConverterProvider
提供特定类型的转换器(否则 MyClass
的定义不' 很有意义:它应该 return 不同的转换器用于不同的 N
,而不是总是 StringDuplicatorConverter
)。如果是这样,正确的定义是
trait ConverterProvider[N] {
def getConverter: Converter[Integer, N]
}
class MyClass extends ConverterProvider[String] {
override def getConverter: Converter[Integer, String] = {
new StringDuplicatorConverter()
}
}
Scala 代码:
trait Converter[S, T] {
def convert(source: S): T
}
class StringDuplicatorConverter extends Converter[Integer, String] {
override def convert(source: Integer): String = {
source.toString + source.toString
}
}
// whatever, the point is to show potentially many 'converters'
// from Integer (for example) to something
class SomeOtherConverter extends Converter[Integer, User] {
override def convert(source: Integer): User = {
User(source)
}
}
trait ConverterProvider {
def getConverter[N]: Converter[Integer, N]
}
class MyClass extends ConverterProvider {
override def getConverter[N]: Converter[Integer, N] = {
new StringDuplicatorConverter()
}
}
给予
Error:(17, 5) type mismatch;
found : StringDuplicatorConverter
required: Converter[Integer,N]
new StringDuplicatorConverter()
是的。对 getConverter[N]
的调用应该是 return 类型 Converter[Integer,N]
的东西,但 StringDuplicatorConverter
是类型 Converter[Integer,String]
。由于 N
不限于 String
,因此它们是不同的类型,因此无法编译。
如果编译器得到一些保证 N
是 String
的一个或超类型,那么它就可以工作。这可以通过使 return 类型协变来完成...
trait Converter[S, +T] { ...
... 然后定义 getConverter
和覆盖,如下所示:
def getConverter[N >: String]: Converter[Integer, N]
现在编译成功了。
val mc = new MyClass
mc.getConverter.convert(7) // res0: String = 77
可能您真正想要的是为每个 ConverterProvider
提供特定类型的转换器(否则 MyClass
的定义不' 很有意义:它应该 return 不同的转换器用于不同的 N
,而不是总是 StringDuplicatorConverter
)。如果是这样,正确的定义是
trait ConverterProvider[N] {
def getConverter: Converter[Integer, N]
}
class MyClass extends ConverterProvider[String] {
override def getConverter: Converter[Integer, String] = {
new StringDuplicatorConverter()
}
}