2011-01-15 14 views
6

を正しい型を返します:Javaは - 私は、以下のクラス構造を持っている一般的な方法から

public class Team { 
    ... 
} 

public class Event { 

} 

public abstract class Fixture<T extends Team> implements Event { 
    ... 
} 

public abstract class Forecast<Event> { 

} 

public class MyPrediction<T extends Fixture<? extends Team>> extends Forecast<Fixture<? extends Team>>{ 

} 

私はすべての種類のスポーツイベントをモデル化しようとしています(つまり、「フィクスチャ」は2人の参加者プレーの間に特定のゲームのためにあります「イベント」の別のタイプは多数の参加者を有する可能性がある)、特定の「イベント」の結果の予測と一緒になる。

public <T> MyPrediction<Fixture<? extends Team>> getMyPrediction(Fixture<? extends Team> fixture) { 

}

私はfixture引数の一般的な種類がありますが、私はそうすることができないようMyPredictionインスタンスを返すことができるようにしたい:私は、一般的な方法があります。私は、次のような何かを行う場合たとえば、私はコンパイルエラーを取得:

SoccerFixture<EnglishSoccerTeams> soccerMatch = new ScoccerFixture<EnglishSoccerTeams>(); 
MyPrediction<SoccerFixture<EnglishSoccerTeams>> = getMyPrediction(soccerMatch); 

私はこの機能を組み込むために私のクラスの構造を変更することが喜んで。どうすればいいですか?

+1

「もし私が次のようなことをしたら...」(あなたはどんな問題に遭遇しますか?) –

+0

イベントはインターフェースである必要があります –

答えて

1

変更getMyPrediction

public <T extends Fixture<? extends Team>> MyPrediction<T> getMyPrediction(T fixture) 

の署名これは、引数aの固定具の種類コンパイラに指示します結果は同じで、型チェックが合格することができます。

これは完全な例ですが、コンパイルするためのその他のマイナーな変更がいくつかあります。これは、サンプルの使用を示すために、getMyPrediction方法とdoit方法を保持するためのクラスPredictorが導入されています

public interface Team { 
} 

public interface Event { 
} 

public abstract class Fixture<T extends Team> implements Event { 
} 

public abstract class Forecast<T> { 
} 

public class MyPrediction<T extends Fixture<? extends Team>> extends 
     Forecast<Fixture<? extends Team>> { 
} 

public class SoccerFixture<T extends SoccerTeam> extends Fixture<T> { 
} 

public class SoccerTeam implements Team { 
} 

public class EnglishSoccerTeam extends SoccerTeam { 
} 

public class Predictor { 

    public <T extends Fixture<? extends Team>> MyPrediction<T> getMyPrediction(T fixture) { 
     return new MyPrediction<T>(); 
    } 

    public void doit() { 
     SoccerFixture<EnglishSoccerTeam> soccerMatch = new SoccerFixture<EnglishSoccerTeam>(); 
     MyPrediction<SoccerFixture<EnglishSoccerTeam>> myPrediction = getMyPrediction(soccerMatch); 
    } 
} 

他の場所で述べたように、あなたはMyPrediction実装で意味のある作業を実行するために、1つのまたは複数のファクトリオブジェクトを導入する必要がある場合があります。

0

Javaの型システムは、(一般的なパラメータは、実行時に利用できないため、型消去の、あなたが提案するものを直接行うのに十分強力ではありません。

通常の解決策は、別のEventFactoryクラスを作成することで、そのことができます次いで、特定のイベントのサブタイプのインスタンスを作成する必要がある任意の方法を渡す。

関連する問題