class A {
def x(): Unit = {
println("tftf")
}
}
def t[A](x: A): Unit = {
x.x // <- error at this line
}
得到编译错误 - 类型不匹配; found:需要x.type(带底层类型A):?{def x:?}请注意,隐式转换不适用,因为它们不明确:两个方法any2在对象Predef中设置类型[A](x:A)确保[确保]对象类型为[A]的前置部分中的A]和方法any2ArrowAssoc(x:A)ArrowAssoc [A]是可能的转换函数,从x.type到?{def x:?} - t
有人可以用英语解释这个,我是斯卡拉的新手
4 回答
t
的名为A
的通用参数隐藏了名为A
的类 .你写的相当于:
在您的示例中,
A
是具体类型(类) . 但是在函数t[A](x: A): Unit
中,你're trying to use it as a type parameter. There'没什么通用的 .将泛型与函数一起使用的简单示例如下:
此功能将接受任何类型,只需将其打印到控制台即可 .
在
def t[A](x: A)
中,A
是泛型类型参数,与您定义的class A
无关 . 你可以随意命名,比如def t[T](x: T)
.你想要做的事实是:
这里有两个混乱的来源:
您的类型参数阴影类类型A.
类型参数A是不受约束的,隐含地表示
[A <: Any]
,而Any
没有成员x
. 令人困惑的错误消息来自编译器尝试将隐式转换从Any
应用到具有成员x
的内容 .您只需要一个带有A类型参数的函数,但是您不需要类型参数,因为类型A的任何子类型都是类型A作为函数参数的有效替换 .
因此,解决方案就是: