用asm如何声明一个非通用类实现通用接口

问题描述 投票:0回答:1

比如说,我用这个代码

class A implements Supplier<String> {

    String get(){
        ....
    }
}

我使用这段代码,但失败了。

classWriter.visit(
                V1_8,
                ACC_PUBLIC,
                "abc/A",
                null,
                parentName,
                new String[]{"java/util/function/Supplier"}
        );

这些接口声明都是失败的。

javautilfunctionSupplier

<T::LjavalangString;>javautilfunctionSupplier<T&gt。

<T::LjavalangString;>javautilfunctionSupplier<T&gt。

<T::LjavalangString;>javautilfunctionSupplier<TT&gt。

<T::LjavalangString;>javautilfunctionSupplier<TT&gt。

java java-bytecode-asm
1个回答
1
投票

你可以使用 javap 来研究javac如何编译这个类。对于你的签名,其值应该是。

Ljava/lang/Object;Ljava/util/function/Supplier<Ljava/lang/String;>;

作为第一个参数,你需要提供非通用的超级类 然后在通用的值之后,再提供非通用的值。这将作为现在的参数 null,表示非通用类,跳过属性。

注意,泛型方法需要桥方法才能发挥作用。你需要同时实现 Object get()String get() 并简单地将第一个方法委托给第二个方法。将第一个方法标记为合成方法,并且 ACC_BRIDGE.

© www.soinside.com 2019 - 2024. All rights reserved.