如何使用界限表示协变类型参数

时间:2018-10-11 07:15:37

标签: scala generics types

这是原始特征,可以轻松实现而没有任何问题:

trait ZPar[-KNV,+KV] {
  def get(i: KNV):List[KV]
}

现在我正在尝试使用边界模拟方差(类似于dotty在做什么)

trait ZPar[KNV,KV] {
   def get[R  >: KNV](i: R):List[_<:KV]
}

到目前为止看起来不错。直到我尝试实现它:

object ZParImp extends ZPar[String,Int]{
  override def get(i: String):List[_<:Int] = {
    val v:String = i
    List(5)
  }
}
//ERROR: method get overrides nothing

方法get不能像这样被覆盖。

有什么方法可以覆盖方法get吗?

2 个答案:

答案 0 :(得分:2)

如果我们提供一个模仿原始参数的类型参数,它似乎可以工作。

pipeline =make_pipeline(StandardScaler(),MLPClassifier(hidden_layer_sizes=(24,),activation="logistic",solver='lbgfs',alpha=1e-01,random_state=42,tol=1e-4,max_iter=10000))

答案 1 :(得分:2)

我认为您无法完全做到自己想要的。您只知道R >: StringString,而不是RR。如果StringR,那么您将无法做自己想做的事。

在相反的示例中,Any由实例而不是方法固定。因此,这种方法实现了相同的目的:

R

但是显然,这种方法有其缺点,并且可能不是您想要实现的。