代码之家  ›  专栏  ›  技术社区  ›  Abhijit Sarkar

如何使Java上界通配符类型参数符合Kotlin?

  •  0
  • Abhijit Sarkar  · 技术社区  · 5 年前

    鉴于

    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代码?

    0 回复  |  直到 5 年前