時々、型は同じ名前の抽象プロパティを持つ2つのインターフェイスを実装すると宣言されますが、トップレベルの抽象スーパークラスを別のオブジェクトにサブクラス化すると、両方のスーパーインタフェースの抽象プロパティをオーバーライドするクラスは、サブクラスの型引数を使用するときにコンパイルできません。複数継承されたフィールドのプロパティタイプがオーバーライドされた抽象valのサブタイプではありません
生成インターフェイスと抽象クラス:
interface Actor : Type {
val login: Stub<String>
val posts: Config<String, BasePostsArgs>
}
interface SomeConflict : Type {
val posts: Config<String, BasePostsArgs>
}
abstract class BasePostsArgs(
args: ArgBuilder = ArgBuilder.create<String, BasePostsArgs>())
: ArgBuilder by args
同じ名前を持つ2つのスーパ特性オーバーライド生成されたオブジェクトの例:
object Organization : Type, SomeConflict, Actor {
override val login: Stub<String> = stub()
override val posts: Config<String, Organization.PostsArgs> = configStub(PostsArgs())
class PostsArgs(args: ArgBuilder = ArgBuilder.create<String, PostsArgs>())
: BasePostsArgs(args) {
fun first(value: Int): PostsArgs = apply { addArg("size", value) }
fun since(value: Date): PostsArgs = apply { addArg("since", value) }
}
}
そしてAPIのインタフェース:
をinterface Type {
fun <T> stub(): Stub<T> = StubImpl<T, ArgBuilder>()
fun <T, A : ArgBuilder> configStub(argBuilder: A): Config<T, A> = StubConfigImpl(argBuilder)
}
interface Config<T, A : ArgBuilder> {
fun config(): A
}
interface ArgBuilder {
fun addArg(name: String, value: Any): ArgBuilder
fun <T> build(): Stub<T>
companion object {
fun <T, A: ArgBuilder> create(): ArgBuilder = InternalImplementation<T, A>() as A
}
}
異なるフィールドに多型を持たせるために
class OrgPostsQuery(
amount: Int = 100,
from: Date = Date.from(Instant.now())) : Model<Organization> {
val posts by super.model.config()
.first(1000)
.since(from)
.build()
}
(そこ例でposts
のようなフィールドのList<T>
するためのインタフェースの別個のセットがありますが、私は簡潔さのためにそれをアウト左)
私は間違って何をしていますか?またはこれは不可能ですか?
Intellijはそれを示唆していましたが、私はそれを見逃してしまったのか分かりません –