如何在保证存在的集合中调用泛型类型的方法?

时间:2012-02-24 03:02:59

标签: java

我一直在使用泛型,但只是以一种简单明了的方式。

现在我想这样做,我一直在阅读和尝试很多东西,比如使用接口和通配符但没有成功。我想知道是否有一种有效的方法可以通过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
}

2 个答案:

答案 0 :(得分:1)

您要做的是将通用类接受的类型限制为仅实现您期望的行为的类型。您可以通过以下方式执行此操作:

  1. 实现具有预期行为的界面
  2. 将通用类型的范围限制为该接口。
  3. 在您的伪代码的增强版本中进行了说明:

    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
    }
}