地狱Scala专家 - 我需要你的帮助。 我试图用类型参数编写一些通用函数 类型参数无法解析。甚至像String这样的简单内置类型也是如此 没有解决。我正在使用scala 2.12.1和Intellij 2017.1
我已附上
下面的代码段import java.lang.String
trait hello_t
{
def hello_meth1:String
def hello_meth2[T]():T
}
class file_hello extends hello_t
{
// for example String here resolves to java.lang.String
val name:String = "test"
override def hello_meth1 = "hello from method 1"
//But type parameter "String" for hello_meth2 does not resolve - to java.lang.String
// And I get a compilation error see - below
override def hello_meth2[String] = "Hello from method 2"
}
object test extends App
{
val f1 = new file_hello
f1.hello_meth1
f1.hello_meth2
}
/* -- compilation error --
Error:(19, 39) type mismatch;
found : java.lang.String("Hello from method 2")
required: String
override def hello_meth2[String] = "Hello from method 2" ^
*/
答案 0 :(得分:4)
带有类型参数abstract的方法的定义(如trait
中所述)是否意味着此方法是针对所有可能类型定义的(除非您为该类型提供一些约束,这不是问题。)
这意味着,当您实施hello_meth2[T](): T
时,您应该为任何类型提供类型T
的值,而不仅仅是您决定的类型。
例如,map[U](f: T => U): List[U]
中的方法List[T]
是一种创建List[U]
的方法,无论类型U
是什么,前提是您有一个转换函数{ {1}}值为T
个值。
在您的情况下,当您尝试在U
中实施hello_meth2
时,您会提供类型参数(在file_hello
中称为T
)名称trait
,但它仍然是一个类型参数,适用于任何类型,而不仅仅是String
。
您尝试做的事情(如果我理解正确的话)可以用另一种方式解决:您想要的不是具有类型参数的方法,而是具有类型参数的特征。实际上,您希望您的特征具有一个方法,其返回类型取决于特征的特定实现,因此该类型应该是特征的参数。
java.lang.String
或者,如果您不喜欢类型参数,则可以使用类型属性(更加面向对象):
trait hello_t[T] {
def hello_meth1:String
def hello_meth2():T
}
class file_hello extends hello_t[String] {
override def hello_meth1 = "hello from method 1"
override def hello_meth2() = "Hello from method 2"
}