【问题标题】:how to define class in kotlin with member can be accessed in java derived class如何在 kotlin 中使用成员定义类可以在 java 派生类中访问
【发布时间】:2019-01-28 02:53:52
【问题描述】:

在 kotlin 中定义一个带有成员的类

@JvmField protected val clickHandler: BaseClickHandler
@JvmField protected var layoutId : Int

但是当在 java 中试图扩展这个类并访问它的成员时会出错。

interface ViewDelegate {

    fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder
    fun onBindViewHolder(holder: RecyclerView.ViewHolder, item: Data, position: Int)
}


open class ViewDelegateImp(@JvmField protected val clickHandler: BaseClickHandler) : ViewDelegate {

    @JvmField protected var layoutId = R.layout.default

    override fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder {
        return ItemViewHolder(parent.inflate(layoutId, false), clickHandler)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, item: Data, position: Int) {
        (holder as? ItemViewHolder)?.bindView(item, position)
    }
}

//extension:
fun ViewGroup.inflate(layoutId: Int, attachToRoot: Boolean = false): View {
    return LayoutInflater.from(context).inflate(layoutId, this, attachToRoot)
}

在 java 中想从 ViewDelegateImp 派生,并覆盖 var layoutId 并使用受保护的 val clickHandler

class DerivedDelegateImp extends ViewDelegateImp {

    public DerivedDelegateImp(BaseClickHandler clickHandler) {
        super(clickHandler);
        layoutId = R.layout.derived;  // want to use different layout, but get error "cannot resolve layoutId"
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, Data item, int position) {
        super.onBindViewHolder(holder, item, position);
    }

    @NotNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {

        View vw = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);

        return new StoryItemViewHolder(vw, clickHandler); // here got error clickHandler has private access in ViewDelegateImp 

        //return super.onCreateViewHolder(parent);  //<== this is fine
    }
}

【问题讨论】:

    标签: inheritance kotlin kotlin-interop


    【解决方案1】:

    一定是 IDE 的问题,不管其他什么(同步、清理、重建)尝试,它只有在删除项目并重新克隆以获取新的代码库并重新添加这些代码后才有效。

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 1970-01-01
      • 2017-09-30
      • 2011-03-10
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2021-03-05
      相关资源
      最近更新 更多