结论

kotlin中没有匿名内部类的概念,可以使用对象表达式或者对象声明达到匿名内部类的效果

对象表达式

单接口单函数

  1. btn.setOnClickListener(object : OnClickListener{
  2. // 处理单击事件逻辑
  3. ***
  4. });

单接口多函数

  1. window.addMouseListener(object : MouseAdapter() {
  2. override fun mouseClicked(e: MouseEvent) {
  3. // ...
  4. }
  5. override fun mouseEntered(e: MouseEvent) {
  6. // ...
  7. }
  8. })

实现多个接口

  1. val a = 10
  2. val listener = object : Info("submit"),IClickListener {
  3. override fun doClick() {
  4. println("a:$a")
  5. }
  6. }
  7. listener.doClick() // 打印 a:10

doOnEach的实现

  1. fun testDoOnEachOperator() {
  2. Observable.just(5)
  3. .compose(useSchedulers())
  4. .doOnRequest {
  5. Log.i("grass", "doOnRequest: $it")
  6. }
  7. .doOnNext {
  8. Log.i("grass", "doOnNext: ")
  9. }
  10. .doOnEach(object : Observer<Int> {
  11. override fun onNext(t: Int?) {
  12. Log.i("grass", "each onNext: " + t)
  13. }
  14. override fun onError(e: Throwable?) {
  15. Log.i("grass", "each onError: " + e.toString())
  16. }
  17. override fun onCompleted() {
  18. Log.i("grass", "each onCompleted: ")
  19. }
  20. }).subscribe({
  21. value ->
  22. Log.i("grass", "onNext: " + value)
  23. }, {
  24. throwable ->
  25. Log.i("grass", "onError: " + throwable.toString())
  26. }, {
  27. Log.i("grass", "onComplete ")
  28. })
  29. }

对象声明

对象声明必须是全局的

  1. class MainActivity : AppCompatActivity() {
  2. object doOnEachObserver : Observer<Int> {
  3. override fun onCompleted() {
  4. TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  5. }
  6. override fun onError(e: Throwable?) {
  7. TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  8. }
  9. override fun onNext(t: Int?) {
  10. TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  11. }
  12. }

this@xxxx的用法

匿名对象内部访问外部对象

  1. ## MainActivity
  2. findViewById<ImageButton>(R.id.notify_emui_btn).setOnClickListener {
  3. showNotification(this@MainActivity, R.mipmap.emui_icon)
  4. }

参考

  1. Kotlin-对象表达式,对象声明及伴随对象 - 行云间专栏 - CSDN博客
  2. Kotlin之匿名内部类 - easion_zms的专栏 - CSDN博客