以下是一小段代码:
class Foo[A] {
def foo[B](param: SomeClass[B]) {
//
}
}
现在,在foo
内,我该如何:
1)验证B是否与A的类型相同?
2)验证B是否是A的子类型
答案 0 :(得分:7)
您需要隐式类型证据,<:<
用于子类型检查,=:=
用于相同类型检查。请参阅this question的答案。
答案 1 :(得分:7)
作为旁注,实际上并不需要广义类型约束:
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] {...}
}
事实上,我更喜欢这种方式,因为它既略微改进了类型推断,又保证不会使用无关的运行时数据。
答案 2 :(得分:6)
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) = ???
}
在您的情况下,您不需要 generalized type constraints(即=:=
,<:<
)。当您需要在其他地方定义的类型参数上添加约束时,它们是必需的,而不是在方法上。
e.g。确保A
为String
:
class Foo[A] {
def regularMethod = ???
def stringSpecificMethod(implicit ev: A =:= String) = ???
}
如果没有通用类型约束,则无法强制执行类型约束。