【问题标题】:Extension method on WeakReferenceWeakReference 上的扩展方法
【发布时间】:2015-11-22 12:29:13
【问题描述】:

我想创建扩展方法,只有当引用不为空时才会执行方法:

fun WeakReference<T>.safe( body : T.() -> Unit) {
    this.get()?.body()
}

用法示例:

mTimerView.safe({startTimer(time)}) 
// OR
mTimerView.safe { startTimer(time) }

代替:

mTimerView.get()?.stopTimer()

我做错了什么,因为我得到:“未解决的参考:T”?

或者也许没有扩展方法有更简单的方法?

【问题讨论】:

  • 我认为这是一个可用性错误。错误信息具有误导性
  • mTimerView.safe(stopTimer()) 是如何编译的?不应该是mTimerView.safe { stopTimer() }吗?

标签: extension-methods weak-references kotlin


【解决方案1】:

我找到了答案:

fun <T> WeakReference<T>.safe( body : T.() -> Unit) {
    this.get()?.body()
}

【讨论】:

  • 与问题无关,但考虑将您的函数标记为inline 以避免在每个调用站点上创建 lambda。
  • 我之前尝试过,但我得到:错误:(35、20)org.jetbrains.kotlin.codegen.CompilationException:后端(JVM)内部错误:无法内联方法调用'safe' 覆盖 fun onStartClick() { mTimerView.safe { startTimer() } mIsTimerStarted = true mTimerView.safe { enableStop(mIsTimerStarted) } } 原因:方法内联安全 { startTimer() }:无法内联方法调用原因:安全
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多