Kotlin对象表达式

举报
yd_221104950 发表于 2020/12/03 00:59:04 2020/12/03
【摘要】 Java是没有这一说法的。Kotlin的对象表达式是用来创建匿名类的对象用的。 interface MyInterface { fun bar(); } class Box { fun foo(f:MyInterface){ f.bar() } } var d = Box() // 匿名内部类 d.foo(object: MyInterface{ override ...

Java是没有这一说法的。Kotlin的对象表达式是用来创建匿名类的对象用的。

interface MyInterface { fun bar();
}
class Box { fun foo(f:MyInterface){ f.bar() }
}
var d = Box()

// 匿名内部类
d.foo(object: MyInterface{ override fun bar() { print("Ha ha ha") }
})


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

如果有一个超类有指定主构造函数,那么就要传递合适的参数,如果有多个超类,则用逗号分隔开(Kotlin也是单继承,但它可以实现多个接口)。

open class A(x:Int) { public open val y: Int = x
}
interface B { fun bar();
}
interface C { fun ba();
}
// 生成一个对象继承A并接实现接口B,C
var abc: A = object: A(21),B,C{ override val y = 15 override fun bar() { print("B") } override fun ba() { print("C") } }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

如果我们仅仅是要一个对象,而不需要它有任何的超类,对象表达式,可以让我们快速建出一个对象:

var myA = object { var x: Int = 10 var y: Int = 100
}
myA.x = 66
print(myA.x * 2 + myA.y)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意:匿名对象只可以在本地或private声明中作为类型来使用。如果你使用匿名对象作为public函数或属性的返回类型,那么这个函数和属性的真实类型应该声明为匿名对象的超类型,如果你没有指定任何超类型,那么就是Any,且添加在匿名对象的成员将不能访问。

class C {
	// Private函数,所以返回类型是匿名对象类型
	private fun foo() = object {
		val x: String = "x"
	}
	// Public函数,所以返回类型是Any
	fun publicFoo() = object {
		val x: String = "x"
	}
	fun bar() {
		val x1 = foo().x //正确
	val x2 = publicFoo().x // 报错,它不能访问x
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

对象表达式中的代码可以从封闭范围访问变量。:

fun countClicks(window: JComponent) {
	var clickCount = 0
	var enterCount = 0
	window.addMouseListener(object : MouseAdapter() {
		// 对象表达式访问封闭它的范围内的变量
		override fun mouseClicked(e: MouseEvent) { clickCount++
		}
		// 对象表达式访问封闭它的范围内的变量
		override fun mouseEntered(e: MouseEvent) { enterCount++
		}
	})
// ...
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/107825725

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。