如何为泛型边界为Team的League类创建实例对象?
解决League泛型类对象创建问题
首先你的League类泛型声明存在问题——Team本身是带泛型参数的类,所以泛型边界不能只写T extends Team,必须补充Team的泛型参数(用通配符或具体类型),否则编译器会报错。
第一步:修正League类的泛型声明
你可以根据需求选择两种修正方式:
方式1:允许联赛容纳任意类型球员的球队
如果你的联赛不需要限制球队的球员类型,把泛型边界改成通配符形式:
public class League<T extends Team<?>>{ public String name; private ArrayList<T> league = new ArrayList<>(); public League(String name) { this.name = name; } public boolean addTeam(T team){ if(league.contains(team)){ System.out.println("It is already exist"); return false; }else{ league.add(team); return true; } } public void showLeagueTable(){ Collections.sort(league); for(T t:league){ System.out.println(t.getName()+" : "+t.ranking()); } } }
方式2:只允许联赛容纳特定球员类型的球队
如果你的联赛只针对某类球员的球队(比如只接受足球队),就指定具体的Player子类:
// 假设你有FootballPlayer继承自Player public class League<T extends Team<FootballPlayer>>{ // 原有代码保持不变 }
第二步:创建League对象
根据上面的两种声明方式,对应创建对象的代码如下:
对应方式1的创建示例
// 创建可容纳任意球队的联赛 League<Team<?>> generalLeague = new League<>("综合联赛"); // 假设存在FootballPlayer和BasketballPlayer两个Player子类 Team<FootballPlayer> manUtd = new Team<>("曼联"); Team<BasketballPlayer> lakers = new Team<>("湖人"); // 向联赛添加球队 generalLeague.addTeam(manUtd); generalLeague.addTeam(lakers);
对应方式2的创建示例
// 创建只接受足球队的联赛 League<Team<FootballPlayer>> footballLeague = new League<>("英超联赛"); Team<FootballPlayer> manCity = new Team<>("曼城"); Team<FootballPlayer> liverpool = new Team<>("利物浦"); footballLeague.addTeam(manCity); footballLeague.addTeam(liverpool);
额外注意事项
目前你的Team类虽然实现了Comparable<Team<T>>,但缺少compareTo方法的实现;另外showLeagueTable里调用的ranking()方法也未定义,这会导致Collections.sort()无法正常工作,需要补充这两个方法:
public class Team<T extends Player> implements Comparable<Team<T>> { // 原有成员变量和方法保持不变 @Override public int compareTo(Team<T> otherTeam) { // 按胜场数倒序排序,可根据需求调整规则 return Integer.compare(otherTeam.getWon(), this.getWon()); } public int ranking() { // 简单的积分计算:胜场3分,平场1分 return this.won * 3 + this.tide; } }
内容的提问来源于stack exchange,提问作者CHANDRA MOULIESH N
相关产品推荐
相关产品推荐

