了解Kotlin中的物化和通配符如何工作

如果问题的题目不是很重要,我很抱歉,但是我还没有find更好的方法来描述这个问题。

我正在为Hadoop编写一些Kotlin扩展方法,昨天我列出了一个我不明白的奇怪错误。 我写了几个这样的扩展方法:

inline fun <reified T : InputFormat, reified K : Mapper> Job.addMultipleInputPath(path: Path) { MultipleInputs.addInputPath(this, path, T::class.java, K::class.java) } inline fun <reified T : OutputFormat, reified Key : Any, reified Value : Any> Job.addMultipleNamedOutput(namedOutput: String) { MultipleOutputs.addNamedOutput(this, namedOutput, T::class.java, Key::class.java, Value::class.java) } inline fun <reified T : Mapper, reified KeyClass : Any, reified ValueClass : Any> Job.setMapper() { this.setMapperClass() this.mapOutput() } 

如果我尝试在我的Driver类中调用它们,(1)和(3)工作,但(2)给我一个编译错误:

 with(Job.getInstance()) { // works addMultipleInputPath(secInput) // 2 type arguments expected for class TextOutputFormat : FileOutputFormat // defined in org.apache.hadoop.mapreduce.lib.output addMultipleNamedOutput(HIGH_TEMP) // works setMapper() } 

如果我使用<TextOutputFormat>来改正呼叫<TextOutputFormat>一切正常,但我不明白为什么会发生这种情况。 有没有什么我错过了如何物化和generics在Kotlin工作?

One Solution collect form web for “了解Kotlin中的物化和通配符如何工作”

这是关于原始types,kotlin不允许的。

这种格式的作品:

 addMultipleNamedOutput, Text, SensorData>(HIGH_TEMP) //(1) 

这两个不是:

 addMultipleNamedOutput(HIGH_TEMP) //(2) 

所以现在事情变得清晰了。 TextOutputFormat是非法的,因为Kotlin不允许原始types。 你必须指定(2)中缺少的types参数。 添加它们将导致格式(1)。

这看起来有点冗长,但目前没有解决方法(至少恕我直言)。

  • 断言与Kotin中的错误消息
  • Kotlin允许扩展现有types是否好?
  • Kotlin空课的目的是什么?
  • 当使用Java / Kotlin进行编程时,建议使用尾递归还是迭代版本? 性能有什么不同?
  • genericstypes和多态性
  • 在kotlin REPL中导入jar子
  • IllegalArgumentException:savedInstanceState指定为非空为空
  • Int上的Kotlin引用平等行为,值介于-128到127之间
  • 尝试同步gradle时无法加载类“kotlin.collections.CollectionsKT”错误
  • Android Kotlin nextin排除了最后的随机食物
  • Gradle错误 - 当我在单个Kotlin文件或特定测试函数上运行unit testing时
  • Kotlin language will be the best programming language for Android.