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

pet*_*bel 0 polymorphism scala

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

假设这段代码:

class A {def foo() = 5}
class B {def foo() = 6}
def fooer[T](x:T) = x.foo()
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

这完全有道理,因为编译器不可能知道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)
               ^
Run Code Online (Sandbox Code Playgroud)

但没有成功

Lee*_*Lee 5

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

def fooer[T <: {def foo(): Int}](x:T) = x.foo()
Run Code Online (Sandbox Code Playgroud)

然后它会工作.

  • 这确实使用引擎盖下的反射.但是如果没有C++样式模板和所有需要的代码生成,就没有办法避免它. (3认同)
  • 你也可以简化为`def fooer(x:{def foo():Int})= x.foo()` (2认同)