6

SCJP-6 試験の準備中に、難しい問題に直面しました。自分で答えを見つけることはできません。質問に答えて、短いコメントをお願いします。

abstract class A<K extends Number> {
   // insert code here
}    
  1. public abstract <K> A<? extends Number> useMe(A<? super K> k);

  2. public abstract <K> A<? super Number> useMe(A<? extends K> k);

  3. public abstract <K> A<K> useMe(A<K> k);

  4. public abstract <V extends K> A<V> useMe(A<V> k);

  5. public abstract <V super K> A<V> useMe(A<V> k);

  6. public abstract <V extends Character> A<? super V> useMe(A<K> k);

  7. public abstract <V super Character> A<? super V> useMe(A<K> k);

上記のプレースホルダーに挿入できるメソッドはどれですか?

PS仕様を調べてみました。それらは私にとって役に立ちませんでした。

4

4 に答える 4

3

回答 1、2、3: ジェネリック型Kシャドウ クラス type K。これらのメソッドKには、新しいジェネリック型があります。コンパイラは条件付き評価を渡そうとします<K extends Number>。方法 1,2 は成功し、3 - 失敗します。

回答 4 は完全に正しいです。

回答 5,7 には構文エラーがあります。

<V extends Number>テストが失敗するため、答え 6 は不正解です。

于 2010-07-28T10:22:42.383 に答える
3

これを行う最善の方法は、それぞれを試して、コンパイラが何を教えてくれるかを確認することです。それぞれについて次の結果が得られます (NetBeans を使用しているため、結果は多少異なる場合があります)。

public abstract <K> A<? extends Number> useMe(A<? super K> k);
// seems to work

public abstract <K> A<? super Number> useMe(A<? extends K> k);
// type parameter ? extends K is not within its bound

public abstract <K> A<K> useMe(A<K> k);
// type parameter K is not within its bound

public abstract <V extends K> A<V> useMe(A<V> k);
// seems to work

public abstract <V super K> A<V> useMe(A<V> k);
// > expected
// illegal start of type
// <identifier> expected
// missing method body, or declare abstract
// cannot find symbol
//   symbol: class V
//   location: class A<K>

public abstract <V extends Character> A<? super V> useMe(A<K> k);
// type parameter ? super V is not within its bound

public abstract <V super Character> A<? super V> useMe(A<K> k);
// > expected
// illegal start of type
// <identifier> expected
// missing method body, or declare abstract
于 2010-05-26T15:16:03.190 に答える
1

もう少し説明しようと思います...

スーパークラスがサブクラスと同じクラスを拡張するという保証はありませA<? super K>ん。A<K extends Number>

1、2、および 3 は機能しません。これは、初期型パラメーターが、クラス宣言で使用される元の K を隠しているためです。

スーパークラスがサブクラスと同じクラスを拡張するという保証<V super K>がないため、5 は機能しません。<K extends Number>

6と7は明らかです。

4 が機能するのは、V が K を拡張することがわかっている場合、V が Number を拡張していることがわかるためです (K が V を拡張するすべてのクラスのため)。したがって、 に置き換えることができA<V>ます<K extends Number>

これが理にかなっていることを願っています...誰かが来て、よりよく説明できるかもしれません.

于 2010-05-26T15:50:42.843 に答える
0

2 番目 ( public abstract A useMe(A k);) のみが動作するようで、IDE にプラグインするだけです。

于 2010-05-26T15:13:56.497 に答える