- PR -

ジェネリックの書き方について

1
投稿者投稿内容
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2006-01-28 05:17
以下のコード

interface Foo<E, N extends Foo.Bar<E>>
{
public interface Bar<E>{}
}

abstract class AbstractFoo<E, N extends AbstractFoo.AbstractBar<E>>
implements Foo<E, N>
{
public abstract class AbstractBar<E> implements Foo.Bar<E>{}
}

において,Fooだけだとコンパイルは通りますが,下のAbstractFooについて
AbstractFoo.AbstractBar<E>
の部分で

型の形式が不適切です。raw 型に指定された型パラメーターです。

というエラーとなります.
この点に関してFooの記述とAbstractFooの記述は同じように思うのですけど
どうしてこれはエラーとなるのでしょうか
また,正しい書き方はどうなるのでしょうか
a-san
ベテラン
会議室デビュー日: 2004/06/01
投稿数: 53
投稿日時: 2006-01-28 21:20
こちらではこんなメッセージが出ます。
メンバー型 AbstractFoo.AbstractBar<E> は static ではないため、パラメーター化された型で修飾される必要があります。
解決方法は、インナークラスをstaticにするか、インナークラスではなく別々のクラスにすればよいでしょう。
原因はよくわからないです。インナークラスにしている、ということは、内側から外側のフィールドなどが使えるのですが、そのあたりに原因がありそうな・・・
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2006-01-30 15:44
なるほど,確かにstaticをつけたらうまくできました

それにしてもどうしてこの違いがでてくるのか感覚的には
まったく納得がいかないですね

実際にやろうとしているものはstaticな内部クラスなので
結果的には良かったわけですが,サンプルを作ってテストするときに
staticはこれには関係ないだろうと思ってはずしてしまったのです.
なぜ変わってくるのかわからんです.
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2006-01-30 16:13
非staticなインナークラスは、親オブジェクトへの暗黙の参照を持ちます。

コード:
abstract class AbstractFoo<E, N extends AbstractFoo.AbstractBar<E>> 
implements Foo<E, N> 
{ 
  public abstract class AbstractBar<E> implements Foo.Bar<E>{
    private AbstractFoo<E,N> parent; // <--明記しないが、こういうものが作られる。
  }
}



この暗黙の参照を作るためにはEとNの2個のパラメータを渡す必要があるので、
AbstractBarの宣言にもEとNの2個のパラメータが渡されている必要があります。


1

スキルアップ/キャリアアップ(JOB@IT)