为通用参数设置“双重”限制

时间:2013-12-14 17:59:09

标签: scala

我有3个班级:

abstract class Abs1 { ... }
abstract class Abs2 { ... }

class MyClass[T <: /*Abs1 or Abs2*/] { ... }

是否有任何方式指明T必须是Abs1 Abs2的孩子?

1 个答案:

答案 0 :(得分:2)

简而言之:不。

T类型的对象意味着什么?您可以调用哪种方法,因为您不知道它是否在Abs1中公开了任何方法(因为它可能是从Abs2派生的类型)或{{1}中公开的任何方法(因为它可能是从Abs2派生的类型)。您只能使用为Abs1AnyAbs1的任何其他常见父项定义的方法,如果它们有一些。

在这种情况下,您也可以直接接受此超级类型,并在方法中操作Abs2(或常见父类型的AnyAbs1)对象而不是对象类型为Abs2。或者你不能对T施加任何约束:这会给你一个可以用任何特定类型实例化的泛型类,但你不会知道任何关于这种类型的东西,除了它派生自T