2016-05-15 202 views
4

我正在玩ASM並分析類的泛型簽名。本節中的文件可能包含的內容描述here並且可以與下面的語法來概括:什麼是::在簽名中的含義?

TypeSignature:ž| C | B | S |我| F | J | D | FieldTypeSignature

FieldTypeSignature:ClassTypeSignature | [TypeSignature | TypeVar

ClassTypeSignature:11d中(/ Id)的 TypeArgs? *; *

TypeArgs(同上TypeArgs。):< TypeArg +>

TypeArg: ** | (+ | - )? FieldTypeSignature *

TypeVar:T Id;

但是,我發現對於這不是真的一個案例:

trait SomeTrait 
class SomeClass[T <: SomeTrait] 

泛型簽名SomeClass<T::LSomeTrait;>Ljava/lang/Object;

我不明白,爲什麼::出現這裏是什麼意思。從語法角度來看,加倍:是無效的。有趣的是,如果我將trait替換爲abstract class::將替換爲單個:(期望的)。

任何想法?

+1

http://stackoverflow.com/questions/20001427/double-colon-operator-in-java-8 – nullpointer

+0

@nullpointer如何可能的重複適用於此? – sepp2k

回答

3

類文件規範說(在段4.7.9.1. Signatures):

ReferenceTypeSignature: 
    ClassTypeSignature 
    TypeVariableSignature 
    ArrayTypeSignature 
TypeParameters: 
    < TypeParameter {TypeParameter} > 
TypeParameter: 
    Identifier ClassBound {InterfaceBound} 
ClassBound: 
    : [ReferenceTypeSignature] 
InterfaceBound: 
    : ReferenceTypeSignature 

將此應用於<T::LSomeTrait;>意味着:

TypeParameters 
=> < TypeParameter {TypeParameter} > 
=> < Identifier ClassBound {InterfaceBound} {TypeParameter} > 
=> < T ClassBound {InterfaceBound} {TypeParameter} > 
=> < T : [ReferenceTypeSignature] {InterfaceBound} {TypeParameter} > 
=> < T : {InterfaceBound} {TypeParameter} > 
=> < T : : ReferenceTypeSignature {TypeParameter} > 
=> < T : : LSomeTrait; {TypeParameter} > 
=> < T : : LSomeTrait; > 
=> <T::LSomeTrait;> 

總而言之,第一個冒號引入結合的類和第二結腸介紹界面綁定。兩個冒號保持在一起的事實意味着沒有階級界限。

簽名既具有類和接口:

scala> trait T 
defined trait T 

scala> abstract class A 
defined class A 

scala> class C[X <: A with T] 
defined class C 

scala> :javap C 
    Size 554 bytes 
    MD5 checksum 6273d85df5987e350e7112726756a55f 
    Compiled from "<console>" 
public class C<X extends A & T> extends java.lang.Object 
    minor version: 0 
    major version: 50 
    flags: ACC_PUBLIC, ACC_SUPER 
Constant pool: 
    #1 = Utf8    C 
    #2 = Class    #1    // C 
    #3 = Utf8    <X:LA;:LT;>Ljava/lang/Object; 
... 
+0

不僅是一個很好的答案,我還了解到有一個':javap'命令:) – Mifeet

+0

太好了,謝謝! –