小编Agl*_*Agl的帖子

scala中的协变类型参数需要在java接口中保持不变

我有一个看起来像这样的特征(我可以在这个相关问题上找到一些更多的信息,虽然我不认为,这个问题需要它)

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)

java generics scala scala-2.8

12
推荐指数
2
解决办法
1458
查看次数

继承和(自动?)类型转换

请看一下下面的代码,其中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)

scala

7
推荐指数
1
解决办法
548
查看次数

标签 统计

scala ×2

generics ×1

java ×1

scala-2.8 ×1