【问题标题】:How to call 'super()' from a secondary constructor in kotlin?如何从 kotlin 中的辅助构造函数调用“super()”?
【发布时间】:2020-01-20 05:07:31
【问题描述】:

我刚刚开始使用 kotlin,我在 java 中有一段代码,我必须将其转换为 kotlin。这是java代码:

public class NonSwipeableViewPager extends ViewPager
{
    public NonSwipeableViewPager(Context context) {
        super(context);
        setMyScroller();
    }

    public NonSwipeableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        setMyScroller();
    }

    private void setMyScroller() {
        //some code
    }
}

如果这段代码中只有一个构造函数,我可以这样写:

class NonSwipeableViewPager(context: Context): ViewPager(context) {

     init {
         setMyScroller()
     }

     private fun setMyScroller() {
         //some code
     }
 }

但是,由于有两个构造函数,并且每个构造函数都调用super() 方法,我不知道如何将这段代码转换为 kotlin。我最接近的是:

class NonSwipeableViewPager(context: Context): ViewPager(context) {

     init {
         setMyScroller()
     }

     constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {
         setMyScroller()
     }

     private fun setMyScroller() {
         //some code
     }
 }

但是,在这段代码中,我在这一行 super(context!!, attrs) 中收到以下错误: primary constructor call expected 那么,如何从二级构造函数调用super()?

【问题讨论】:

    标签: java android kotlin


    【解决方案1】:
    class NonSwipeableViewPager: ViewPager {
    
        init {
            setMyScroller()
        }
    
        constructor(context: Context) : super(context)
        constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
    
        private fun setMyScroller() {
            //some code
        }
    }
    

    请注意,两个二级构造函数都不需要调用setMyScroller(),因为init 块将在super 调用之后立即调用。

    【讨论】:

    • 1.这里没有主构造函数,两个构造函数都是次要的; 2.他们都不需要调用,因为init块在两者之前被调用(但在super调用之后)。
    • 感谢@AlexeyRomanov,我已经更新了我的答案以反映这一点。
    【解决方案2】:

    像这样更改你的代码

    class NonSwipeableViewPager : ViewPager {
        constructor(context: Context?) : super(context!!) {
            setMyScroller()
        }
    
        constructor(context: Context?, attrs: AttributeSet?) : this(context) {
            setMyScroller()
        }
    
        private fun setMyScroller() { //some code
        }
    }
    

    而不是

     class NonSwipeableViewPager(context: Context): ViewPager(context) {
    
         init {
             setMyScroller()
         }
    
         constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {
             setMyScroller()
         }
    
         private fun setMyScroller() {
             //some code
         }
     }
    

    【讨论】:

    • 感谢您的回答。我想我已经尝试过这段代码。但是,这条线 super(context!!, attrs) 呢?即使我使用您的代码,我的问题仍然存在。 如何从二级构造函数调用super()?
    • @JayeshBabu 这可能对你有帮助 link
    • 另一个答案解决了我的问题..还是谢谢你
    猜你喜欢
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    相关资源
    最近更新 更多