2009-06-07 19 views
5

私はセットアップ以下のクラスを持っている:Javaのジェネリック、ジェネリック拡張と抽象クラス

public abstract class Process<T,S> { 
    ... 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    protected S processer; 
    ... 
} 

public class ProcessImpl<EventType1, EventType2> { 
    ... 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 
    processer = new ProcesserImpl(); 
    ... 
} 

私はResourceImplに到達するまで、すべてが大丈夫です。私はProcessImplがタイプの限定されたパラメータ<S extends Process<T,S>>の代用として有効ではないと言われています。

私はこれを回避し、壁を叩いていくさまざまな方法を試みました。

誰にもアイデアはありますか?

答えて

11
public class ProcessImpl<EventType1, EventType2> { 
... 
} 

ProcessImplがプロセスを拡張していないので。 ProcessImplはProcessから派生したものではありません。これは、そのパラメータが宣言しているものです。

0

元のバージョンを編集する方法や、適切な担当者がいなければ、指定した回答にコメントする方法はありません。

このコードはWebレイヤー上に存在し、eventtype2は永続レイヤーで定義され、このレベルの下に存在するコアレイヤーでのみアクセス可能です。

残念ながら、私は避けたいタイトカップリングを使用していないため、EventType2にアクセスすることはできません。

+0

私は分かりません。 ProcessImplをProcessから拡張することはできませんか? –

1

あなたはこのような何かしたいと思うかもしれません:あなたはまた、適切ProcessImplクラスでそれを宣言する必要がありプロセッサであることをResourceSパラメータを制約する場合

public abstract class Process<T, S> { 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    S processor; 

} 

public class ProcessImpl extends Process<EventType1, ProcessImpl> { 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 

} 

を。私はEventType2が何であるかはわかりませんが、Processインターフェイスを実装する必要があります。私はあなたが実際にProcessImplと言いたいと思っていました。

0

Processが含まれている既存のパッケージにコードを依存させたくない場合は、クラス階層の一番下の部分に応じて新しいインターフェイスパッケージを導入することもできます。 (継承の制約を当然変えることができれば)

関連する問題