Kotlin:返回一个通用的接口

在Kotlin,我试图编译以下内容:

  1. 给定一个与genericstypes的接口(Printer)
  2. 和该接口的两个实现(DogPrinter和CatPrinter)
  3. 根据外部variables(AnimalType)返回其中一台打印机

下面的代码不能编译,因为需要一个types: fun getMapper(animalType: AnimalType): Printer

我试图使用但没有成功。 有人可以帮忙吗?

(通过将以下代码复制到https://try.kotlinlang.org,很容易看出错误)

 enum class AnimalType { CAT, DOG } class Dog class Cat interface Printer { fun mapToString(input: T): String } class DogPrinter : Printer { override fun mapToString(input: Dog): String { return "dog" } } class CatPrinter : Printer { override fun mapToString(input: Cat): String { return "cat" } } private fun getMapper(animalType: AnimalType): Printer { return when(animalType) { AnimalType.CAT -> CatPrinter() AnimalType.DOG -> DogPrinter() } } fun usage_does_not_compile() { getMapper(AnimalType.DOG) .mapToString(5) } 

我修改了一下你的代码。 getMapper函数现在与reified 泛化typesinline ,这使getMapper()的调用非常可读。

阅读关于这里的具体 reified : Kotlin中的关键字关键字是什么?

 private inline fun  getMapper(): Printer { when (T::class) { Cat::class -> return CatPrinter() as Printer Dog::class -> return DogPrinter() as Printer } throw IllegalArgumentException() } fun main(args: Array) { println(getMapper().mapToString(Dog())) println(getMapper().mapToString(Cat())) } 

事实上甚至没有必要,但是使得客户端更具可读性。 或者,您也可以将该类作为parameter passing给getMapper函数。 真正重要的是使这个通用 。 不加限制的演员阵容不是很酷,但在这里似乎很安全。

Kotlin没有原始types,所以你不能从getMapper返回Printer 。 您可以返回Printer<*> ,使getMapper通用,或者将您的inheritance结构更改为具有公共超types。

返回Printer<*>正常工作。 但它不是实际有用的,因为你不能调用mapToString(Dog()) (我认为mapToString(5)是一个错字),这是一件好事:如果它编译

 getMapper(AnimalType.CAT).mapToString(Dog()) 

也将不得不编译,因为返回types只能依赖于参数types ,而不是AnimalType.CATAnimalType.DOG具有相同的types。 有一些语言允许它,但Kotlin不是其中之一。