Scala中的类型相等
下面是一段代码:Scala中的类型相等,scala,Scala,下面是一段代码: class Foo[A] { def foo[B](param: SomeClass[B]) { // } } 现在,在foo中,我该如何: 1) 验证B是否与A的类型相同? 2) 验证B是否是a的子类型?您需要隐式类型证据, 1) 验证B是否与A的类型相同 2) 验证B是否为a的子类型 在这里,如果没有通用类型约束,则无法强制执行类型约束。作为旁注,通用类型约束实际上是不必要的: class Foo[A] { def foo_subParam[B <:
class Foo[A] {
def foo[B](param: SomeClass[B]) {
//
}
}
现在,在foo
中,我该如何:1) 验证B是否与A的类型相同?
2) 验证B是否是a的子类型?
您需要隐式类型证据,
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] {...}
}
Foo类[A]{
def foo_子参数[B:A](参数:SomeClass[B]){…}
def foo_eqParam[B>:A:MyType:A:MyType:A如果A和B是我定义的类,我必须自己实现这些隐式吗?@Sergey不,只需附加一个额外的(隐式ev:B Hi@Ptharien's Flame,我刚刚看到了你的答案,看起来很有趣。你能解释一下吗?MyType是从哪里来的?你是如何使用foo_eqMyType方法的?提前谢谢你的回答。@FrancisToth这只是一个占位符名称。我可以使用Bar
或Baz
只是同样容易。在示例中,MyType
意味着某个类型不是类型参数,而是来自其他地方。至于方法的用法,您只需调用它!类型推断和类型检查将自动处理其余部分。
class Foo[A] {
def foo[B <: A](param: SomeClass[B]) = ???
}
// or
class Foo[A] {
def foo[B](param: SomeClass[B])(implicit ev: B <:< A) = ???
}
class Foo[A] {
def regularMethod = ???
def stringSpecificMethod(implicit ev: A =:= String) = ???
}
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] {...}
}