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)
但没有成功
问题是A.foo返回Int不是Integer.如果您将方法更改为:
def fooer[T <: {def foo(): Int}](x:T) = x.foo()
Run Code Online (Sandbox Code Playgroud)
然后它会工作.
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |