Eclipse编译器lambda参数类型签名

时间:2016-12-02 16:21:04

标签: java eclipse lambda bytecode eclipse-jdt

给出以下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上的错误吗?

0 个答案:

没有答案