这是一小段代码:
class Foo[A] {
def foo[B](param: SomeClass[B]) {
//
}
}
现在,在里面foo
,我如何:
1) 验证 B 是否与 A 类型相同?
2) 验证 B 是否是 A 的子类型?
这是一小段代码:
class Foo[A] {
def foo[B](param: SomeClass[B]) {
//
}
}
现在,在里面foo
,我如何:
1) 验证 B 是否与 A 类型相同?
2) 验证 B 是否是 A 的子类型?
您需要隐式类型证据,<:<
用于子类型检查和=:=
相同类型检查。请参阅此问题的答案。
作为旁注,广义类型约束实际上不是必需的:
class Foo[A] {
def foo_subParam[B <: A](param: SomeClass[B]) {...}
def foo_supParam[B >: A](param: SomeClass[B]) {...}
def foo_eqParam[B >: A <: A](param: SomeClass[B]) {...}
def foo_subMyType[Dummy >: MyType <: A] {...}
def foo_supMyType[Dummy >: A <: MyType] {...}
def foo_eqMyType[Dummy1 >: MyType <: A, Dummy2 >: A <: MyType] {...}
}
事实上,我更喜欢这种方式,因为它既能稍微改进类型推断,又能保证不使用无关的运行时数据。
1)验证B是否与A相同类型?
class Foo[A] {
def foo(param: SomeClass[A]) = ???
}
// or
class Foo[A] {
def foo[B](param: SomeClass[B])(implicit ev: A =:= B) = ???
}
2) 验证 B 是否是 A 的子类型?
class Foo[A] {
def foo[B <: A](param: SomeClass[B]) = ???
}
// or
class Foo[A] {
def foo[B](param: SomeClass[B])(implicit ev: B <:< A) = ???
}
在您的情况下,您不需要 通用类型约束(即=:=
, <:<
)。当您需要在别处定义的类型参数上添加约束时,它们是必需的,而不是在方法上。
例如,确保A
是String
:
class Foo[A] {
def regularMethod = ???
def stringSpecificMethod(implicit ev: A =:= String) = ???
}
在这里,如果没有通用类型约束,您将无法强制执行类型约束。