Scala泛型推理
我希望对具有对象序列s的类进行自动类型推断,这些对象序列s是a的后代,并且知道a接受泛型参数Scala泛型推理,scala,generics,Scala,Generics,我希望对具有对象序列s的类进行自动类型推断,这些对象序列s是a的后代,并且知道a接受泛型参数 class A[F](val field1: F) class G[F, Aa <: A[F], S <: Seq[Aa]](val s: S) { // what i have to do } // Evrything is ok val gWith = new G[Int, A[Int], List[A[Int]]](List(new A(5))) // Compilator
class A[F](val field1: F)
class G[F, Aa <: A[F], S <: Seq[Aa]](val s: S) {
// what i have to do
}
// Evrything is ok
val gWith = new G[Int, A[Int], List[A[Int]]](List(new A(5)))
// Compilator failed: inferred type arguments [Nothing,Nothing,List[A[Int]]]
val gWithout = new G(List(new A(5)))
我要补充的是,我明确地需要知道Aa和S类型,以便以后重用它们
是否有任何解决方案可以分配用户放置这些泛型类型。如果没有,我很乐意知道原因。您可以简化G类的类型参数:
工作条件:您可以通过类型约束实现您想要的
class A[F](val field1: F)
class G[F, Aa, S](val s: S)(implicit ev2: S <:< Seq[Aa], ev1: Aa <:< A[F]) {}
val gWithout = new G(List(new A(5))) // gWithout: G[Int,A[Int],List[A[Int]]] = G@79d7035
我无法解释为什么它以前不起作用以及为什么它现在起作用,但我可以告诉你,它与类型推断有关,我使用“-explaintypes”标志在RELP中使用你的代码片段已经有一段时间了,我总是发现一些奇怪的错误,如:
除非我明确需要知道Aa或S类型,否则我不同意您的任何意见。@KyBe请参阅更新的答案和scastie。这更符合你的要求吗?
class A[F](val field1: F)
class G[F, Aa, S](val s: S)(implicit ev2: S <:< Seq[Aa], ev1: Aa <:< A[F]) {}
val gWithout = new G(List(new A(5))) // gWithout: G[Int,A[Int],List[A[Int]]] = G@79d7035