java和kotlin之间的泛型!!帮我?

时间:2018-05-03 06:29:47

标签: java generics kotlin

这是我的代码

[Kotlin]

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) {}

}

Parent类的Generics名为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生成的代码..

1 个答案:

答案 0 :(得分: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>
)