8

这是一小段代码:

class Foo[A] {
  def foo[B](param: SomeClass[B]) {
  //
  }
}

现在,在里面foo,我如何:
1) 验证 B 是否与 A 类型相同?
2) 验证 B 是否是 A 的子类型?

4

3 回答 3

7

您需要隐式类型证据,<:<用于子类型检查和=:=相同类型检查。请参阅此问题的答案。

于 2012-07-12T11:45:51.590 回答
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] {...}
}

事实上,我更喜欢这种方式,因为它既能稍微改进类型推断,又能保证不使用无关的运行时数据。

于 2012-07-13T01:27:37.030 回答
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) = ???
}

在您的情况下,您不需要 通用类型约束(即=:=, <:<)。当您需要在别处定义的类型参数上添加约束时,它们是必需的,而不是在方法上。

例如,确保AString

class Foo[A] {
  def regularMethod = ???
  def stringSpecificMethod(implicit ev: A =:= String) = ???
}

在这里,如果没有通用类型约束,您将无法强制执行类型约束。

于 2012-07-12T14:11:35.733 回答