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)确保[确保]对象Predef中的类型为[A]的x和方法any2ArrowAssoc(x:A)ArrowAssoc [A]是从x.type到?{def x:?}的可能转换函数 - t
有人可以用英语解释这个,我是scala的新手
答案 0 :(得分:5)
t
名为A
的通用参数会隐藏名为A
的类。
你所写的内容相当于:
class A {
def x(): Unit = {
println("tftf")
}
}
def t[B](x: B): Unit = {
x.x // <- error at this line
}
答案 1 :(得分:3)
在您的示例中,A
是具体类型(类)。但是在函数t[A](x: A): Unit
中,您尝试将其用作类型参数。关于它没有任何通用。
将泛型与函数一起使用的简单示例如下:
def t[A](x: A): Unit = println("Here is the parameter x: " + x)
此功能将接受任何类型,只需将其打印到控制台即可。
答案 2 :(得分:2)
在您的def t[A](x: A)
中,A
是一个通用类型参数,与您定义的class A
无关。您可以随意命名,例如def t[T](x: T)
。
你想要做的事实是:
def t[B <: A](x: B): Unit = {
x.x // won't error
}
答案 3 :(得分:0)
这里有两个混乱的来源:
您的类型参数阴影类类型A.
类型参数A不受约束,隐含地表示[A <: Any]
,而Any
没有成员x
。令人困惑的错误消息来自编译器尝试将Any
的隐式转换应用于具有成员x
的内容。
您只需要一个带有A类型参数的函数,但是您不需要类型参数,因为类型A的任何子类型都是类型A作为函数参数的有效替换。
因此解决方案就是这样:
def t(a: A) {
a.x()
}