誰かが JLS re: most specific method のセクション 15.12.2.5 を理解するのを手伝ってくれませんか?
(JLSからの殴打されたカット&ペーストが続きます)
さらに、次のいずれかの場合、m という名前の可変アリティ メンバー メソッドは、同じ名前の別の可変アリティ メンバー メソッドよりも具体的です。
- 1 つのメンバー メソッドには n 個のパラメーターがあり、もう 1 つのメンバー メソッドには k 個のパラメーターがあります。ここで、n >= k です。最初のメンバ メソッドのパラメータの型は、T1、. . . 、Tn-1、Tn[]、他のメソッドのパラメータの型はU1、.. . 、英国-1、英国[]。2 番目のメソッドがジェネリックの場合、R1 ... Rp p1 をその正式な型パラメーターとし、Bl を Rl の宣言された境界、1lp とし、A1 ... Ap を推論される実際の型引数 (§15.12.2.7) とします。初期制約の下でのこの呼び出しに対して、Ti << Ui,1ik-1, Ti << Uk, kin and let Si = Ui[R1 = A1, ..., Rp = Ap] 1ik; それ以外の場合は、Si = Ui、1ik とします。次に: 1 から k-1 までのすべての j について、Tj <: Sj、および k から n までのすべての j について、Tj <: Sk、および、 2 番目の方法が上記の一般的な方法である場合、Al <: Bl [R1 = A1, ..., Rp = Ap], 1lp.
- 1 つのメンバー メソッドには k 個のパラメーターがあり、もう 1 つのメンバー メソッドには n 個のパラメーターがあります。ここで、n >= k です。最初のメソッドのパラメーターの型は、U1、. . . 、Uk-1、Uk[]、他のメソッドのパラメータの型はT1、.. 、Tn-1、Tn[]。2 番目のメソッドがジェネリックの場合、R1 ... Rp p1 をその正式な型パラメーターとし、Bl を Rl の宣言された境界、1lp とし、A1 ... Ap を推論される実際の型引数 (§15.12.2.7) とします。初期制約の下でのこの呼び出しに対して、Ui << Ti, 1ik-1, Uk << Ti, kin and let Si = Ti[R1 = A1, ..., Rp = Ap] 1in; それ以外の場合は、Si = Ti, 1in とします。次に: 1 から k-1 までのすべての j について、Uj <: Sj、および k から n までのすべての j について、Uk <: Sj、および 2 番目のメソッドが上記のようなジェネリック メソッドである場合、Al <: Bl [R1 = A1, ..., Rp = Ap], 1lp.
問題のジェネリックを無視すると、これは、あるメソッドが別のメソッドよりも具体的かどうかを判断するときに、可変引数がサブタイプよりも重要であるか、またはサブタイプが可変引数よりも重要であることを意味しますか? 私はそれを理解することはできません。
具体例: compute()
JLS によると、次のどの方法が「より具体的」ですか?
package com.example.test.reflect;
class JLS15Test
{
int compute(Object o1, Object o2, Object... others) { return 1; }
int compute(String s1, Object... others) { return 2; }
public static void main(String[] args)
{
JLS15Test y = new JLS15Test();
System.out.println(y.compute(y,y,y));
System.out.println(y.compute("hi",y,y));
}
}
どちらが「より具体的」かわかりません。出力プリント
1
2
結果をどう解釈するか迷っています。最初の引数が文字列の場合、コンパイラはより具体的なサブタイプを持つメソッドを選択しました。最初の引数がオブジェクトの場合、コンパイラはオプションの可変引数の数が少ないメソッドを選択しました。
注: JLS のこのセクションを読んでおらず、引数の型に依存する回答をしている場合、あなたは私を助けていません。ジェネリックに関連する部分を除いて、JLS を注意深く読むと、「より具体的な」の定義は、実際の引数ではなく、宣言された引数に依存します。これは、JLS の他の部分で機能します (見つからない現時点では)。
たとえば、固定アリティ メソッドの場合compute(String s)
は、より具体的になりcompute(Object o)
ます。しかし、私は JLS re: variable arity メソッドの関連セクションを理解しようとしています。