【问题标题】:Type in abstract class constructor can't be inferred using KClass<>无法使用 KClass<> 推断抽象类构造函数中的类型
【发布时间】:2020-07-03 20:30:03
【问题描述】:

我正在尝试制作一个抽象的基础片段并在其中初始化视图。

abstract class BaseFrag<V: View>(private val clazz: KClass<V>) : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? =
            clazz.constructors.firstOrNull()?.call(context)
}

我可以这样初始化片段:class HomeFrag : BaseFrag&lt;HomeView&gt;(HomeView::class)

有什么方法可以推断 HomeView 并改为输入 class HomeFrag : BaseFrag(HomeView::class)

【问题讨论】:

    标签: android android-fragments kotlin generics


    【解决方案1】:

    使用out 修饰符尝试这种方法:

    abstract class BaseFrag(private val clazz: KClass<out View>) : Fragment() { ... }
    
    class HomeFrag : BaseFrag(HomeView::class)
    

    【讨论】:

    • 你的回答是正确的,真棒,我完全忘记了。我唯一的问题是我稍后会使用 V,例如:lateinit var layout: V。知道是否可能吗?
    • 如果使用泛型参数,则应在创建子类时指定:class HomeFrag : BaseFrag&lt;HomeView&gt;(HomeView::class)
    【解决方案2】:

    我尝试了几种方法来达到这个结果,但我没有成功。恐怕还是不可能的。

    https://discuss.kotlinlang.org/t/infer-abstract-class-type-from-constructor/1913

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-23
      • 2021-11-24
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 2020-10-17
      • 2016-08-21
      • 1970-01-01
      相关资源
      最近更新 更多