Scala定义自定义类型-类型不匹配错误

时间:2020-06-12 12:48:05

标签: scala generics types scala-collections custom-type

我正在做一个基本练习,以了解Scala用户定义的类型。考虑以下示例:

public abstract class AbstractClass <T extends AbstractClass <T>> {

   public T genericMethod(){
       //do stuff
       return (T) this;
   }
}

无法编译,类型错误:

type MyType[T <: AnyVal] = (List[Seq[T]], String, String)
val g: MyType = (List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar")

但是,它将编译:

type MyType takes type parameters
[error]     val g: MyType = (List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar")

有没有一种方法可以让Scala可以自动确定类型而无需指定确切的参数类型?我知道对于功能,我们可以执行以下操作:

type MyType[T <: AnyVal] = (List[Seq[T]], String, String)
val g: MyType[Int] = (List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar")

在这种情况下,我不需要显式调用f1 Int ,我只需执行f1(...)即可。

1 个答案:

答案 0 :(得分:3)

你可以写

val g = (List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar")

,编译器将推断类型。您可以检查g: MyType[Int]是否已编译。

您也可以

def TypeOf[F[_ <: AnyVal]] = new PartiallyAppllied[F]
class PartiallyAppllied[F[_ <: AnyVal]] {
  def apply[A <: AnyVal](fa: F[A]) = fa
}

val g = TypeOf[MyType]((List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar"))

g: MyType[Int]