【发布时间】:2018-08-20 11:36:49
【问题描述】:
假设我有以下代码:
open class Fruit
class Apple : Fruit()
open class Juice<T : Fruit>
class AppleJuice : Juice<Apple>()
fun <F : Fruit, J : Juice<F>> makeJuice(juiceClass : Class<J>, fruit : F) : J {}
我这样调用函数:
val appleJuice : AppleJuice = makeJuice(AppleJuice::class.java, Apple())
但我不想传递类对象,而是将AppleJuice 作为类型传递:
val appleJuice : AppleJuice = makeJuice<AppleJuice>(Apple())
我已将我的函数重构为与reified 内联:
inline fun <F : Fruit, reified J : Juice<F>> makeJuice(fruit : F) : J {}
但现在我必须指定两种类型:
val appleJuice : AppleJuice = makeJuice<Apple, AppleJuice>(Apple())
理论上,应该不需要Apple 类型,因为它已经从AppleJuice 类型中得知。是否有可能以某种方式摆脱传递不必要的类型而只传递那些作为reified 的类型?
【问题讨论】:
-
在这种情况下是否可以将
makeJuice函数放在Juice类中? -
如果您实际传入哪个
Fruit并不重要,那么您可以删除F并改用Juice<out Fruit>和Fruit参数。 -
@Mosius 不,这是不可能的。必须是静态方法
-
扩展函数也是静态方法...扩展函数可以吗? ;-)
-
好吧...我不认为您可以按照您想要的方式拥有一个具有具体类型的静态函数(即您实际上需要 2 个泛型类型)。我的答案中的变体 3 可能是您在不编写大量额外实现的情况下可以获得的最好的。
标签: kotlin kotlin-generics kotlin-reified-type-parameters