私はこのように私のparse
機能で使用するための一般的な代数的データ型を定義したい:T
はその後、未定義の参照であるようなぜ汎用代数データ型はメンバ型に `T`を必要としますか?
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
を追加する場合:
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)
これが望ましい構文ですが私にはなぜ結果をT
に残すべきかを理解するのに苦労しています。
ありがとうございます。 'Result'は厳密には一般的である必要はありませんが、' parse'は 'Success'ジェネリック型が 'Parser 'と同じである 'Result'を生成するので、好きです。私がResult Iに 'T 'を含まない(おそらく誤って)とすれば、APIはタイプセーフではないと信じています。 –
FuleSnabel
'fun foo():Result'のようなメソッドシグネチャが必要な場合はどうすればいいですか?返される値はSuccess またはFailureのいずれかになります。 –
miguel