sagen, dass ich einen einzigen Parameter generische Methode machen:in welchen Fällen nicht scala richtig konvertieren String zu java.lang.String
trait MyTrait[T] {
def method():T
}
Und dann verlängern sie und parametrisieren. Dies:
class MyClass extends MyTrait[java.lang.String] {
def method() = "foo"
}
ist die gleiche wie folgt aus:
class MyClass extends MyTrait[String] {
def method() = "foo"
}
Wenn Sie jedoch ein Merkmal-Methode machen, die eine Lambda wie so parametrisiert:
trait MyTrait {
def apply[T](input:()=>T):T
}
Dann bist du nicht so glücklich. Dies:
class MyClass extends MyTrait {
def apply(input:()=>java.lang.String) = "foo"
}
Wird dazu führen:
Error:(25, 45) type mismatch;
found : java.lang.String("foo")
required: String
def apply[String](input:()=>String) = "foo"
^
Doch das ist in Ordnung:
class MyClass extends MyTrait {
def apply[String](input:()=>String) = new String("foo")
}
Also in welchen Fällen nicht scalac wissen eigentlich die Umwandlung getan werden muss, und in In welchen Fällen nicht?
Außerdem, auch wenn ich den gesamten Pfad zu dem Typ java.lang.String schreiben
class MyClass extends MyTrait {
def apply[java.lang.String](input:()=>java.lang.String) = new java.lang.String("foo")
}
Es wirft einen weiteren Fehler:
Error:(25, 21) ']' expected but '.' found.
def apply[java.lang.String](input:()=>java.lang.String) = new java.lang.String("foo")
^
Wenn ich wirklich wollte es dieses letztere tun Weise, indem ich direkt java.lang.String template, wie würde ich es tun?
'def apply [String]' Hier deklarieren Sie einen Typparameter namens 'String'. –