我正在做一个基本练习,以了解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(...)即可。
答案 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]