Scala泛型推理

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

我希望对具有对象序列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 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