【问题标题】:Scala Defining Custom Type - Type Mismatch ErrorScala 定义自定义类型 - 类型不匹配错误
【发布时间】:2020-10-02 06:58:03
【问题描述】:

我正在做一个基本的练习来理解 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
}

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

【问题讨论】:

  • 也许这可以回答你stackoverflow.com/questions/21147001/…?
  • 您的函数示例与您的问题没有任何关系。 Scala 可以推断类型,但如果你是显式的,你就必须对所有事情都显式。

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


【解决方案1】:

你可以写

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]

【讨论】:

  • 没错。 Scala 可以推断类型。但是如果你想自己写下来,你必须写完整的类型,而不仅仅是它的一部分。
  • 至于“反例”,你也不能声明像def f1[T](lst: List[T])(implicit ev: ClassTag)这样的函数。 List 和 ClassTag 都需要得到他们的完整签名。您可以输入List[_],但不仅仅是List。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多