Android View类中OnClickListener接口匿名实现语法疑问
Java匿名内部类实现接口的括号语法说明
你提到的写法差异本质是Java语言的强制语法要求,和View.OnClickListener本身是接口的属性没有关联,具体规则如下:
- Java的匿名内部类有固定语法结构:
当你基于接口创建匿名实现类时,接口本身没有构造方法,所以括号中不需要传任何参数,但这对括号是语法结构的必要组成部分,不能省略,和普通方法调用的括号语义完全不同。new 父类类型/接口类型 (构造参数列表) { // 类的成员实现、方法重写内容 } - 你写的省略括号的写法,是Kotlin语言的匿名对象实现接口的语法,Java不支持该规则:
Kotlin中实现单抽象方法接口时确实可以省略括号,语法为:
你大概率是混淆了Java和Kotlin两种语言的语法规则才会产生这个疑问。val ob = object : View.OnClickListener { override fun onClick(v: View?) { // 点击逻辑 } } // Kotlin对函数式接口还有更简化的Lambda写法: val ob = View.OnClickListener { /* 点击逻辑 */ }
额外补充Java该语法的设计逻辑:Java中new关键字的作用是触发类的构造方法调用,基于接口生成的匿名实现类会默认继承java.lang.Object类,同时实现你指定的接口,语法上View.OnClickListener()对应的是这个匿名实现类的无参构造调用,实际执行的是父类Object的无参构造方法,所以括号必须保留。
内容的提问来源于stack exchange,提问作者Arghadeep Dey
相关产品推荐
相关产品推荐

