编译器接受中缀和通用方法,但是如何使用它的语法呢?
例如,给出这两个相同的方法(取任意通用类型的模数):
我可以写:
但是这个调用无效:
有人能解释一下为什么吗?
infix inline fun Int1.plus1(i: Int1) = Int1(this.value + i.value)
infix inline fun <U> Int1.plus2(i: Int1) = Int1(this.value + i.value)
我可以写:
我会写:
Int1(3).plus1(Int1(4))
Int1(3) plus1 Int1(4)
Int1(3).plus2<Int>(Int1(4))
但是这个调用无效:
Int1(3) plus2<Int> Int1(4)
有人能解释一下为什么吗?
Int1
的类Int2
。然后您有这个函数:infix inline fun <reified U> U.print(i: Int) = println("${U::class} $i")
。如果您想要U
是Int1
,则可以像这样调用它:Int2(5).print<Int1>(4)
。是否可能使用中缀符号进行此调用? - marstranInt
。问题在于类型为U
的接收器。我需要转换它吗?似乎有点奇怪,只有在处理中缀函数时才需要使用转换。 - marstranInt2(5) print<Int1> 4
那样写。这似乎是一个绕过强制转换的方法。 - marstraninfix inline fun <reified U> Int.print(i: Int) = println("$this ${U::class} $i")
。使用普通符号调用它可以正常工作:5.print<String>(4)
打印出5 class kotlin.String 4
。 - marstrancom.jayway.jsonpath.JsonPath#read
的中缀函数,它接受两个字符串但返回一个通用类型(将结果转换为指定类型)。似乎这样的函数无法使用中缀符号调用。 - Dario Seidl