现在我不是假装这段代码是很好的编程习惯,但我不明白它为什么不能编译。这是怎么回事?
object CustomTo extends App {
val thing:Something = new Something
val str:String = thing.to[String]
println(str)
}
class Something {
def to[String]:String = {
"hello"
}
}
编译器输出:
CustomTo.scala:9: error: type mismatch;
found : java.lang.String("hello")
required: String
"hello"
^
one error found
答案 0 :(得分:1)
您将类型参数String
命名为T
而不是def to[String]:String
// is the same as
def to[T]:T
,但这并不会使它不那么抽象,它仍然可以是任何东西。
.to[T]
如果你想创建一个通用的String
函数,当用TypeTag
调用时返回hello,即你想在一个类型上模式匹配,你可以使用T
:
编辑:我只是忽略了返回类型需要import reflect.runtime.universe._
def to[T : TypeTag] = (typeOf[T] match {
case t if t =:= typeOf[String] => "hello"
case t if t =:= typeOf[Int] => 1
case _ => ???
}).asInstanceOf[T]
,这意味着无用的演员必须在那里,见下文。
scala> to[String]
res13: String = hello
scala> to[Int]
res14: Int = 1
scala> to[Double]
scala.NotImplementedError: an implementation is missing
...
和
ClassTag
我不确定是否有办法让编译器自己推断模式匹配中的内容具有正确的类型。使用.to[List[Int]]
可能有效,但使用{{1}}和类似情况会丢失类型安全性......
答案 1 :(得分:0)
编译器需要“String”,如果你想放
class Something {
def to[T]:T = {
"hello"
}
}
你会得到像"required: T"
这样的东西。换句话说,您将“String”绑定到某种类型。你的例子现在没有很多意义上的提示。你想要完成什么?