给出以下Java代码:
public interface HasUniqueKey<Key> {
Key getInternId();
}
public class Util {
public static List<Integer> toIntegerList(List<? extends HasUniqueKey<Integer>> entities) {
return entities.stream().map(m -> m.getInternId()).collect(Collectors.toList());
}
}
Eclipse Mars和Neon(尚未测试其他人)正在为lambda生成以下字节码(如javap -v -p -c -l -s -constants
所示):
private static java.lang.Integer lambda$0(HasUniqueKey);
descriptor: (LHasUniqueKey;)Ljava/lang/Integer;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokeinterface #68, 1 // InterfaceMethod HasUniqueKey.getInternId:()Ljava/lang/Object;
6: checkcast #74 // class java/lang/Integer
9: areturn
LineNumberTable:
line 8: 0
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 m LHasUniqueKey;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 10 0 m !+LHasUniqueKey<Ljava/lang/Integer;>;
我对参数m
的最后一个签名感到非常困惑:!+LHasUniqueKey<Ljava/lang/Integer;>;
。它似乎不符合however,&#34;!+&#34;那里是无效的(我不知道&#34;!&#34;在这种情况下是什么意思)。
javac
编译器不生成LocalVariableTypeTable
元数据,因为它仅用于调试器。
任何人都可以提供一些有关此签名意味着什么的见解吗?这是Eclipse JDT上的错误吗?