【问题标题】:Generic Static Constant通用静态常量
【发布时间】:2020-04-07 10:23:59
【问题描述】:

这很难解释,但我基本上希望能够有一个我的子类需要实现的接口,它要求一个静态常量。我将如何在 Kotlin 中实现这一目标?

我有以下类/接口:

interface BaseFragmentInterface {
  val TAG: String
}

class BaseFragment: Fragment() {
  /* this, of course, doesn't compile right now: */
  companion object: BaseFragmentInterface {}

  func<T: BaseFragment> push(fragment: T) {
    /* Here I want to access TAG */
    Log.d(T.TAG, "Push Fragment")
  }
}

我的子类需要实现接口。而且我的基本伴侣对象需要以某种方式abstract

知道如何实现吗?

【问题讨论】:

  • 所以我猜你的BaseFragment 应该是abstract 对吧?因为在您提供的代码 sn-p 中,它是 final
  • 我觉得和这里的问题一样:stackoverflow.com/questions/35327443/…
  • @Neo 我以前发现过这个。不幸的是,它不起作用。没有基类可以按我需要的方式访问它。

标签: android generics kotlin


【解决方案1】:

让我准确地说几件事。

我的子类需要实现接口。

没有办法实现这一点,你不能强制子类'companion object 实现你的接口,因为类的companion object 与其超类的companion object 无关。

而且我的基础伴侣对象需要以某种方式抽象。

由于companion objectobject,它不能是abstract,因为object 也不能是abstract

也就是说,您仍然有两种选择来实现您想要的行为:

  1. 使用TAG 作为BaseFragment 内的非静态最终属性:
abstract class BaseFragment : Fragment() {
    protected abstract val TAG: String

    fun <T : BaseFragment> push(fragment: T) {
        /* Here I want to access TAG */
        Log.d(TAG, "Push Fragment")
    }
}

class FragmentImpl : BaseFragment() {
    override val TAG: String = "fragment-impl"
}
  1. 使用伴随对象来保存标签,将push()的类型T设为reified,并使用反射访问T的伴随对象内的TAG属性.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 2013-06-13
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2012-07-14
    相关资源
    最近更新 更多