【问题标题】:generics between java and kotlin !! help me?java和kotlin之间的泛型!!帮我?
【发布时间】:2018-05-03 06:29:46
【问题描述】:

这是我的代码

[科特林]

internal abstract class Parent<out T, in V> constructor(
    tList: List<T>,
    vList: List<V>
) {

    abstract fun get(): List<T>
    abstract fun set(v: List<V>)

}

[ Java ] - 它继承了 kotlin 类 Parent。

final class Child extends Parent<Number, String> {

    public Child(
            @NotNull List<? extends Number> tList, 
            @NotNull List<? extends String> vList) {
        super(tList, vList);
    }

   @NotNull @Override
    public List<Number> get() {
        return null;
    }

    @Override
    public void set(@NotNull List<? extends String> v) {}

}

父类具有称为 T(out)、V(in) 的泛型

所以我认为..

Child 类的构造函数应该是..

public Child(
        @NotNull List<? extends Number> tList, 
        @NotNull List<? super String> vList) {
    super(tList, vList);
}

即第二个参数 vList 应该是

List<? super String>

因为父母的 Generic 的 V 是 'in' 但它是..

List<? extends String>

有人能解释一下吗?帮帮我!

[已编辑]...

public Child(
        @NotNull List<Number> tList, 
        @NotNull List<String> vList) {
    super(tList, vList);
}

有可能..我的问题中的代码只是从 IDE 生成的代码..

【问题讨论】:

  • 为什么不同时用 Java 编写这两种语言,以免让自己头疼呢?
  • 为什么不同时用 Kotlin 编写并省去自己的麻烦?

标签: java generics kotlin


【解决方案1】:

在 Kotlin 中,接口 List 是不可变的,这意味着它是只读的。

这是它的签名:

public interface List<out E> : Collection<E>

所以你的构造函数实际上是这样的:

internal abstract class Parent<out T, in V> constructor(
    tList: List<out T>,
    vList: List<out V>
)

如果您想将值放入vList(您使用in 声明),则必须使用 MutableList 接口:

internal abstract class Parent<T, V> constructor(
    tList: List<T>,
    vList: MutableList<in V>
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多