【发布时间】:2016-06-25 14:13:20
【问题描述】:
我想定义一个通用代数数据类型以用于我的parse 函数,如下所示:
sealed class Result<T> {
class Success(val value: T, val pos: Int) : Result<T>()
class Failure(val message: String, val pos: Int) : Result<T>()
}
fun <T> parse(t: Parser<T>, input: String, initialPos: Int = 0, collectErrors: Boolean = true) : Result<T> {
但是这是不允许的,因为 T 是一个未定义的引用。
如果我将T 添加到所有成员类型,它会起作用:
sealed class Result<T> {
class Success<T>(val value: T, val pos: Int) : Result<T>()
class Failure<T>(val message: String, val pos: Int) : Result<T>()
}
对我来说,这有点令人困惑,这让我相信我在这里遗漏了一些东西。为什么在第一种情况下定义成员类型时看不到T?
此外,在创建Success 的实例时,我希望语法为:
Result<T>.Success<T>(tv.someValue, pos)
但这行不通,而是我这样做:
Result.Success<T>(tv.someValue, pos)
这对我来说是更可取的语法,但我很难理解为什么我应该在此处的 Result 中省略 T。
【问题讨论】: