私はJavaとジェネリックに比較的慣れていません。私は何か間違ったことをしているのか、ジェネリックメソッドを書いていないのかを理解しようとしています。次のコードがあります(大幅に簡略化されています):
public class ContentIniter {
public ContentType getContentType();
}
public interface Content {
}
public class Show implements Content {
}
public class Movie implements Content {
}
public enum ContentType {
Movie, Show
}
public class Channel {
public List<Show> getShows() {
return getContentByType(ContentType.Show)
}
public List<Movie> getMovies() {
return getContentByType(ContentType.Movie)
}
private <T> List<T> getContentByType(ContentType contentType) {
List<T> typeContents = Lists.newArrayList();
List<ContentIniter> allContentIniters = someMethod(); // Returns initers for both shows and movies
for (Content contentIniter : allContentIniters) {
if (contentIniter.getContentType().equals(contentType)) {
switch (contentType) {
case Movie:
typeContents.add((T) new Movie(contentIniter));
break;
case Show:
typeContents.add((T) new Show(contentIniter));
break;
}
}
}
return typeContents;
}
}
私の質問は、次の行に関連しています。
typeContents.add((T) new Movie(contentIniter));
コードをコンパイルする唯一の方法は、コンテンツ オブジェクトを T にキャストすることです。 )。さらに、コードは機能しますが、IntelliJ はチェックされていないキャストについて不平を言います。
ジェネリック メソッドを記述するより良い方法はありますか?
更新:コードを単純化しようとしたときに、コードを少し台無しにしました。への参照を修正しましたtypeContents
。また、単にinstanceof
.
更新 2 : さらに別のエラーが発生したことに気付きました...ContentIniter
コンテンツを実装していません。また、注目に値するのContentIniter
は、単なる作り物のオブジェクトです。奇妙に思える場合は、コンテンツ オブジェクトが特定の動作を委任するために使用するイベントまたはその他の戦略と考えてください。