8

私は現在 Java コンパイラを作成しており、セクション 15.12.2.7 を実装しています。JLS7 ( http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7 ) の、仕様の最も厄介なセクションの 1 つです。仕様がどういうわけか指定不足またはあいまいに見えるため、まだ1つの問題があります。私の問題はこの行です:

lcta(U)=?U の上限が Object の場合、そうでない場合は ? lub(U,Object) を拡張します

U は任意の型式です。型式の上限は? さらに、なぜ lcta は常にワイルドカードなのですか?

仕様が定義する

CandidateInvocation(G) = lci(Inv(G)) .

ここで、たとえば、Inv(G) = { List<String> } の場合を考えてみましょう。つまり、可能な唯一の候補呼び出しは、単一のパラメーター化された型です。さて、ルールにより

lci(G<X1, ..., Xn>) = G<lcta(X1), ..., lcta(Xn)> ,

CandidateInvocation( G ) = lci( { List<String> } ) の結果は次のように定義されます。

List<lcta(文字列)>

私の意見では、lcta は単純にここで String を返す必要があります。List<String> が唯一の可能な呼び出しである場合は、List<String> を引数として推測することをお勧めします。ただし、lcta(U) の定義は、結果が次のいずれかであることを示しています。また ?lub(...) を拡張するため、結果は常にワイルドカードになります。これは奇妙に思えます。ここで何を誤解していますか?

4

2 に答える 2

6

これは仕様のバグのようです。の句はlcta(U)JSL3には存在しませんでした。どうやら JLS3 の の定義は のlci(e1..en)場合に不完全n=1であり、新しい仕様はそれを修正しようとしています。しかし、あなたが推論したように、修正は意味不明のようです。

Javac7は、追加された節を無視してlci( { List<String> } )として計算します。List<String>

この問題は、仕様維持者に提起する必要があります。彼らに連絡する方法がわからない。openjdk compiler-devメーリング リストを試すことができます。それに詳しい人がいます。

于 2012-05-21T21:09:23.807 に答える
1

compiler-dev メーリング リストで質問したところ、次のような回答がありました。

はい、ここで仕様が間違っています。lcta(U) のルールは、まったくがらくたです :)。さらに、彼らは、単一の引数に対して lcta(U) をまったく呼び出さず、U のみを使用する方がさらに良いと主張しました (単一の引数 U の最も一般的でない型引数は常に U 自体であるべきであるため)。

于 2012-06-15T10:23:18.850 に答える