我对 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
它只是一个虚构的对象。如果看起来很奇怪,可以将其视为 Content 对象用来委托某些行为的事件或其他策略。