Merchant类中actionPrice方法返回值类型为Number
NaiveMerchant类中actionPrice方法返回值类型为Double
NaiveMerchant类生成的字节码中有两个参数类型相同返回值类型不同的actionPrice方法
Method actionPrice:(DLCustomer;)Ljava/lang/Double;
Method actionPrice:(DLCustomer;)Ljava/lang/Number; // 桥接到返回值为double的方法 flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
方法返回值不同为何也要产生桥接方法呢? 为了保证重写语义?
不知为何javac在编译
NaiveMerchant naiveMerchant = new NaiveMerchant();
Number number = naiveMerchant.actionPrice(1d, null) // 特意要求Number类型的返回值(方法描述符)
时,总invokevirtual到Method NaiveMerchant.actionPrice:(DLCustomer;)Ljava/lang/Double,这又是为什么呢?
附jdk版本
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
GraalVM 1.0.0-rc5 (build 25.71-b01-internal-jvmci-0.46, mixed mode)
展开
作者回复: 1 对的,为了保证重写语义。
2 生成的桥接方法还有一个acc_synthetic标记,代表对程序不可见。因此javac不能直接选取那个方法。