我一直在使用泛型,但只是以一种简单明了的方式。
现在我想这样做,我一直在阅读和尝试很多东西,比如使用接口和通配符但没有成功。我想知道是否有一种有效的方法可以通过Java泛型实现这一点,或者我是否误解了它们应该使用哪种泛型。
假设我想创建一个泛型集合类,一个ArrayList,我想为各种不同的类型创建这样的arraylists但重要的是为了实现某种方法而保证的不同类型。然后,我希望能够从我的通用arraylist中调用该方法。
以下代码非常简单,显然不起作用,我知道。我尝试了比这更复杂的想法,但是我包括以下代码只是为了总结我想要做的事情,并提供一个答案的例子。
请参阅DemonstrateProblem()中的代码行...我希望能够调用它,因为我只会在TestContainer中使用类型来实现方法StartGame()
public class TestContainer<T> extends ArrayList<T> {
public void DemonstrateProblem() {
// assumes we have populated the collection with 5+ objects...
// the line of code below is ultimately what I would like to acheive
this.get(4).StartGame(); // <-- my goal!
}
}
public abstract class Game () {
public void StartGame() {}
public void EndGame() {}
}
public class HockeyGame extends Game {
// ... overrides here
}
public class BaseballGame extends Game {
// ... overrides here
}
public class BasketballGame extends Game {
// ... overrides here
}
答案 0 :(得分:1)
您要做的是将通用类接受的类型限制为仅实现您期望的行为的类型。您可以通过以下方式执行此操作:
在您的伪代码的增强版本中进行了说明:
public interface Game {
public void StartGame();
}
public class TestContainer<T extends Game> extends ArrayList<T> {
public void DemonstrateProblem() {
// assumes we have populated the collection with 5+ objects...
// the line of code below is ultimately what I would like to acheive
this.get(4).StartGame(); // <-- my goal!
}
}
答案 1 :(得分:1)
您无需在T
上保持容器的通用性:您可以在Game
上实例化现有的通用容器,如下所示:
public class TestContainer extends ArrayList<Game> {
public void DemonstrateProblem() {
this.get(4).StartGame(); // <-- should work
}
}