Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin类型->;任何->;打字_Android_Generics_Kotlin - Fatal编程技术网

Android Kotlin类型->;任何->;打字

Android Kotlin类型->;任何->;打字,android,generics,kotlin,Android,Generics,Kotlin,我想知道,如果在科特林有一种方法可以做到这一点: interface EnumClassX { ... } enum class EnumClassA: EnumClassX { ... } enum class EnumClassB: EnumClassX { ... } enum class EnumClassC: EnumClassX { ... } object Foo { fun bar(enumClassA: EnumClassA) { ... }

我想知道,如果在科特林有一种方法可以做到这一点:

interface EnumClassX {
...
}

enum class EnumClassA: EnumClassX {
...
}
enum class EnumClassB: EnumClassX {
...
}
enum class EnumClassC: EnumClassX {
...
}

object Foo {
   fun bar(enumClassA: EnumClassA) {
       ...
   }
   fun bar(enumClassB: EnumClassB) {
       ...
   }
   fun bar(enumClassC: EnumClassC) {
       ...
   }
}

class Middle {
    fun callFooBar(enumClass: EnumClassX) {
        // What I have to do:
        when(enumClass){
            is EnumClassA -> {
                Foo.bar(enumClass) // Note I don't even have to say "enumClass as EnumClassA" b/c it is already inside an "is" block.
            }
            is EnumClassB -> {
                Foo.bar(enumClass)
            }
            is EnumClassC -> {
                Foo.bar(enumClass)
            }
        }

        // What I want to do:
        Foo.bar(enumClass) // IDE says "None of the following functions can be called without the arguments supplied." Compiler can't figure out which flavor of enumClass has been passed in to call the appropriate bar.
    }
}
使用其他简单的检查和开关(如上例中所示)轻松修复,但希望有一种方法可以相应地引导交通?我的意思是Middle.callFooBar总是使用三种类型中的一种来调用,这三种类型都有各自的bar方法,只是想知道Kotlin中是否有一种方法可以让它在不手动检查enumClass类型的情况下调用正确的方法

谢谢!
Scott

这是不可能的,因为您使用的是静态分派。
声明

//callFooBar可以使用CustomObjectA、CustomObjectB或 CustomObjectC

事实上是不正确的。在编译器看来,您的方法可以被任何类的实例调用,而不仅仅是这三个类

要使用动态分派,您需要求助于旧的良好继承。我知道,现在继承并不酷,但你的情况正是它的目的:

interface EnumClassX {
    fun bar()
}

class EnumClassA : EnumClassX {
    override fun bar() { }
}

class EnumClassB : EnumClassX {
    override fun bar() { }
}

class EnumClassC : EnumClassX {
    override fun bar() { }
}
理论上,您的代码也应该使用密封类(而不是枚举,它们是不同的):


但事实并非如此。我的猜测是,这仅仅是因为Kotlin团队不想使编译器进一步复杂化,但也许我只是缺少了一些用例。请随意询问为什么会出现这种情况

每个
bar
方法应该做什么?什么是“直接交通”?你能告诉我们你想要的结果代码是什么样子的吗,或者一些更精确的目标它应该完成什么,为了更清晰,请编辑,谢谢!谢谢阿列克西!我不得不修改我的问题,道歉。正如您在更新的问题中所看到的那样,我尝试使枚举类都扩展一个公共接口,但这还不够窄,无法反映并调用正确的bar方法。再一次,这完全是学术性的,因为一个简单的语句可以完成任务,只是为了更好地理解。
sealed class EnumClassX {
    abstract fun bar()
}

class EnumClassA : EnumClassX() {
    override fun bar() { }
}

class EnumClassB : EnumClassX() {
    override fun bar() { }
}

class EnumClassC : EnumClassX() {
    override fun bar() { }
}