我有一个看起来像这样的特征(我可以在这个相关问题上找到一些更多的信息,虽然我不认为,这个问题需要它)
trait Extractor[-A,+B] {
def extract(d:A):B
//lots of other things
}
Run Code Online (Sandbox Code Playgroud)
要在现有的java框架中使用它,我希望Extractor它有一个函数返回一个Comparator[B](是java.util.Comparator)或更好的扩展Comparator[A].现在这会产生问题,因为Comparators类型参数应该是不变的,而且A是逆变的并且B是协变的.
所以我得到这样的错误:
scala> import java.util.Comparator
import java.util.Comparator
scala> trait Extractor[-A,+B] extends Comparator[A]
<console>:6: error: contravariant type A occurs in invariant position in type [-A,+B]java.lang.Object with java.util.Comparator[A] of trait Extractor
trait Extractor[-A,+B] extends Comparator[A]
^
scala> trait Extractor[-A, +B] {
| def comp:Comparator[B]
| }
<console>:7: error: covariant type B occurs in …Run Code Online (Sandbox Code Playgroud) 请看一下下面的代码,其中Extractor[A,B]是通用框架的一部分,其他一切应该被视为"客户端代码"(我把它煮了很多,并重命名为所有内容.所以不要介意Extractor似乎没有太有用了).
scala> abstract class Extractor[A,B] {
| def extract(d:A):B
| def stringRepr(d:A):String
| }
defined class Extractor
scala> sealed abstract class Value
defined class Value
scala> case class IntValue(i:Int) extends Value
defined class IntValue
scala> case class StringValue(s:String) extends Value
defined class StringValue
scala> case class Data(i:Int, s:String)
defined class Data
scala> sealed abstract class MyExtractor[Value] extends Extractor[Data, Value] {
| def stringRepr(d:Data) = extract(d) match {
| case IntValue(i) => i.toString
| case StringValue(s) => …Run Code Online (Sandbox Code Playgroud)