首页 > 解决方案 > 如何使 Java 上限通配符类型参数符合 Kotlin?

问题描述

给定

public interface StubTransformer {
    AbstractStub<?> transform(String name, AbstractStub<?> stub);
}

public static <T extends AbstractStub<T>> T attachHeaders(T stub, Metadata extraHeaders) {...}

这个 Kotlin 类无法编译。

class MetadataInjectingStubTransformer: StubTransformer {
    override fun transform(name: String, stub: AbstractStub<*>): AbstractStub<*> {
        val header = Metadata()
        return MetadataUtils.attachHeaders(stub, header)
    }
}

错误

Type parameter bound for T in 

fun <T : AbstractStub<T!>!> attachHeaders(stub: T!, extraHeaders: Metadata!): T!
is not satisfied: inferred type AbstractStub<*>! is not a subtype of AbstractStub<AbstractStub<*>!>!

但是Java版本可以强制编译。

public class MetadataInjectingStubTransformer implements StubTransformer {
    @Override
    @SuppressWarnings("unchecked")
    public AbstractStub<?> transform(String name, AbstractStub stub) {
        Metadata header = new Metadata();    
        return MetadataUtils.attachHeaders(stub, header);
    }
}

我们如何使 Kotlin 代码编译?

标签: javakotlingenerics

解决方案


推荐阅读