我处理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)
^
但没有成功
答案 0 :(得分:5)
问题是A.foo
会返回Int
而不是Integer
。如果您将方法更改为:
def fooer[T <: {def foo(): Int}](x:T) = x.foo()
然后它会起作用。