У меня есть следующий фрагмент, который (я думаю) определяет метод addNumber1(x:T):T
для универсального типа T
, который является подтипом AnyVal
и имеет метод +(s:Int):T
.
def addNumber1[T <: AnyVal {def +(s:Int):T}](x:T):T = {x + 1}
addNumber1(31) // compiles but throws exception
java.lang.NoSuchMethodException: java.lang.Integer.$plus(int)
at java.lang.Class.getMethod(Class.java:1786)
at .reflMethod$Method1(<console>:8)
at .addNumber1(<console>:8)
... 33 elided
Я попытался добавить import scala.language.reflectiveCalls
, чтобы подавить предупреждение о функции, но все равно получаю ошибку.
Я могу использовать это при работе с AnyRef
или Any
, как показано ниже:
def addNumber1[T <: Any {def +(s:Int):T}](x:T):T = {x + 1}
class Foo(s:String) {def +(i:Int) = new Foo((s+1).toString)} // random code
class Bar(s:Foo) {def +(i:Int) = new Bar(new Foo(i.toString))} // random code
addNumber1(new Foo("1")) // works
addNumber1(new Bar(new Foo("1"))) // works
addNumber1(1) // compiles but gives exception