我正在尝试编写一个枚举函数print(),该函数可以通过枚举Molecule中的对象调用,如下所示
Molecule.HYDROGEN_MOLECULE.print()
myMolecule.print()我不想给函数提供一个特定的Enum对象:
Molecule.print(Molecule.HYDROGEN)但是,当我在Molecule中创建函数时,当我试图引用MolecularFragment列表时,我得到一个错误。
我需要在print()中使用什么语法才能使像myMolecule.print()这样的东西引用特定枚举对象的MolecularFragment列表?
enum class Molecule (val MolecularFragments : List<MolecularFragment> = emptyList()) {
HYDROGEN_MOLECULE(listOf(MolecularFragment.H2)),
WATER_MOLECULE(listOf(MolecularFragment.H2O)),
// ...
HEXANE_MOLECULE(listOf(MolecularFragment.CH3, MolecularFragment.CH2));
fun print() {
**var x : List<MolecularFragment> = Molecule.MolecularFragments**
x.forEach() {
println("$it")
}
println(" --- ${Molecule.toString()}")
}
}发布于 2018-08-02 22:54:36
我猜这就是你想要的:
enum class MolecularFragment { H2, H2O, CH3, CH2 }
enum class Molecule (val molecularFragments : List<MolecularFragment> = emptyList()) {
HYDROGEN_MOLECULE(listOf(MolecularFragment.H2)),
WATER_MOLECULE(listOf(MolecularFragment.H2O)),
HEXANE_MOLECULE(listOf(MolecularFragment.CH3, MolecularFragment.CH2));
fun print() {
molecularFragments.forEach(::println)
println("${this::class.java.toString()}")
}
}
fun main(args: Array<String>) {
Molecule.HYDROGEN_MOLECULE.print()
}以下是几个注意事项:
molecularFragments放入变量中。发布于 2018-08-02 20:23:59
我会使用类似如下的方法:
enum class MyType(val subTypes: List<String>) {
FIRST_TYPE(listOf("one", "two")),
SECOND_TYPE(listOf("three", "four"));
}
//Honestly his method could be moved in some util .kt file
fun printOneType(myType: MyType) {
myType.subTypes.forEach { print(it.toString()) }
}如果您在打印枚举内部集合中的子对象时遇到问题,那么可能是它们的toString()或其他util方法没有很好地实现--只是一个选择。
编辑。topic starter问题的解决方案要简单得多。无论如何,对于枚举的内部集合,您可以这样做:
enum class MyType(val otherTypes: List<OtherType>) {
FIRST_TYPE(listOf(OtherType.FIRST)),
SECOND_TYPE(listOf(OtherType.SECOND));
}
//Honestly his method could be moved in some util .kt file
fun printOneType(myType: MyType) {
myType.otherTypes.forEach { print(it.name) }
}
}发布于 2018-08-02 20:35:41
正如@marstran已经在评论中指出的:从您标记的行中删除Molecule,使其看起来如下所示:
var x : List<MolecularFragment> = MolecularFragments或者,如果您愿意:
var x : List<MolecularFragment> = this.MolecularFragments枚举类方法访问this枚举值的值,并且不是单例或静态方法。
或者,您也可以提供一个通用的扩展函数,它允许在任何时候打印任何枚举:
fun <T : Enum<T>> Enum<T>.printIt() = toString().also(::println)这样,您只需覆盖toString()-method,甚至可以将该toString-method用于其他目的,例如,示例覆盖:
enum class Molecule ... {
// ...
override fun toString(): String {
return super.toString() + ": $molecularFragments"
}
}。。正如@marstran还指出的: Kotlin中最常见的代码约定是属性以小写字母开头。
https://stackoverflow.com/questions/51653213
复制相似问题