首页 > 解决方案 > Scala 定义自定义类型 - 类型不匹配错误

问题描述

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

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")

但是,这编译:

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")

有没有办法让 Scala 可以自动确定类型而无需指定确切的参数类型?我知道我们可以执行以下功能:

import scala.reflect.ClassTag

def f1[T](lst: List[T])(implicit ev: ClassTag[T]) = {
  lst.toArray
}

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

标签: scalagenericstypesscala-collectionscustom-type

解决方案


你可以写

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]

推荐阅读