比如说,我用这个代码
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>。
<T::LjavalangString;>javautilfunctionSupplier<T>。
<T::LjavalangString;>javautilfunctionSupplier<TT>。
<T::LjavalangString;>javautilfunctionSupplier<TT>。
你可以使用 javap 来研究javac如何编译这个类。对于你的签名,其值应该是。
Ljava/lang/Object;Ljava/util/function/Supplier<Ljava/lang/String;>;
作为第一个参数,你需要提供非通用的超级类 然后在通用的值之后,再提供非通用的值。这将作为现在的参数 null
,表示非通用类,跳过属性。
注意,泛型方法需要桥方法才能发挥作用。你需要同时实现 Object get()
和 String get()
并简单地将第一个方法委托给第二个方法。将第一个方法标记为合成方法,并且 ACC_BRIDGE
.