scala类型参数无法解析

时间:2017-04-20 22:03:52

标签: scala types parameters resolution

地狱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"                                    ^
*/

1 个答案:

答案 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"
}