如何编写参数类函数,其中参数类在scala中声明一些方法?

时间:2014-08-22 18:27:52

标签: scala polymorphism

我处理Scala问题,我无法正确命名,所以也许已经在这里回答(请耐心等待)。

假设这段代码:

class A {def foo() = 5}
class B {def foo() = 6}
def fooer[T](x:T) = x.foo()

我收到错误:

<console>:7: error: value foo is not a member of type parameter T
    def fooer[T](x:T) = x.foo

这完全有道理,因为编译器可能不知道将传递什么类型T。最后问题是 - 我如何实现类型化函数,因此只接受声明了foo方法的类型?

请注意,我不会寻找enum个替代品(请参阅doc),因为我不知道有多少课程(外部图书馆)。这些类没有共同的前任类或特征,也无法修改它们。

这甚至可能吗? C ++语言使用模板支持此行为。我更喜欢不使用反射API的解决方案。

谢谢:)

我尝试了更多fooer的定义,例如

def fooer[T <: {def foo(): Integer}](x:T) = x.foo()
fooer[A](new A)
<console>:10: error: type arguments [A] do not conform to method fooer's type parameter bounds [T <: AnyRef{def foo(): Integer}]
          fooer[A](new A)
               ^

但没有成功

1 个答案:

答案 0 :(得分:5)

问题是A.foo会返回Int而不是Integer。如果您将方法更改为:

def fooer[T <: {def foo(): Int}](x:T) = x.foo()

然后它会起作用。