2017-05-31 3 views
2

を必要とする、ClassSignatureフォームJVM仕様:一般的な署名のための文法は、一般的な署名のための仕様では先読み

ClassSignature: 
    [TypeParameters] SuperclassSignature {SuperinterfaceSignature} 
TypeParameters: 
    < TypeParameter {TypeParameter} > 
TypeParameter: 
    Identifier ClassBound {InterfaceBound} 
ClassBound: 
    : [ReferenceTypeSignature] 
InterfaceBound: 
    : ReferenceTypeSignature 

そこでタイプパラメータの結合スーパークラス(一部examples here)を省略することができました。

クラスの宣言がpublic class A<T, LFooBar>の場合、Javaコンパイラは<T:Ljava/lang/Object;LFooBar:Ljava/lang/Object;>Ljava/lang/Object;の署名を生成します。

IUCでは、クラスバインディングを省略することができます。この場合、署名は<T:LFooBar:>Ljava/lang/Object;になります。短い署名がT:LFooBar:は、2つの型パラメータであることを知っている、とFooBarバインドされたクラスでない1型パラメータTするために、第2 :を見据え必要であることを解析

実際には、クラスバインドを離れることは、インターフェイスがバインドされている場合にのみ行われますか? public class A<T extends Comparable<? super T>>の場合、javacは署名<T::Ljava/lang/Comparable<-TT;>;>Ljava/lang/Object;を生成します。しかし、私はこの仮定に頼ることができないと思う。

私は何かを誤解しましたか?

答えて

0

あなたがよく見ると、ReferenceTypeSignatureの後に続く数字はIdentifierまたは>です。 ReferenceTypeSignature[で始まるか、;で終了し、識別子にはこれらの文字を含めることができません。識別子の後にはタイプシグニチャが表示されない:が続く必要があります。これらのオプションの間に曖昧さはありません。

識別子は>で始めることができるので、末尾にあるかどうかをコロンで調べる必要があります。TypeParametersしかしそれは別の問題です。

私はJVMがそれをどのように実装するかをわからないんだけど、一つの可能​​なアプローチはこれです:

  • は、最初の文字を調べます。それが[の場合、型署名があります。 >の場合は、先頭の[、;、または:]をスキャンします。最初に表示されたものが:であれば、それはあなたが識別子を持っていることを意味します。そうでなければ、型パラメータの終わりを持っています。
  • それ以外の場合は、最初にスキャンしてください。または:。それが:の場合、識別子があります。それ以外の場合は、クラスがバインドされています。

編集:署名の識別子には>を含めることはできません。したがって、そのビットは無視してください。 (また、:、別の潜在的な曖昧さの原因を含めることはできません)

+0

ありがとう、私はやっていることを先読みしている必要があります。あなたは "識別子は>で始まることに注意してください"と言います - あなたは参照を提供できますか?仕様には「文法には終端記号識別子[...]が含まれています。このような名前にはASCII文字は使用できません。 /se8/html/jvms-4.html#jvms-4.7.9.1) –

+1

JVMはGenericsを気にしないので、JVMはそれをまったく実装しません。 [The Reflection code](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/reflect/generics/parser/SignatureParser.java#SignatureParser.parseBounds %28%29)では、先読みは全くありません。だから、「*クラス境界を離れてしまうのは、インタフェースがバインドされている場合にのみ実行されます」という仮定は真実かもしれませんが、仕様と実装の間にはまだ不一致があります。 。 – Holger

+0

@Lukas申し訳ありませんが、私はそのビットについて間違っていたようです。 – Antimony

関連する問題