java - Java 11 中使用泛型进行未经检查的方法 'sort(List<T>)' 调用

标签 java oop generics

我有三个名为 League 的类(class), TeamPlayer ,League 有一个包含球队的数组,我有一个名为 showLeagueTable 的方法。显示团队按 ranking 排序(这是 Team 类中存在的方法)并且 Team 类有一个玩家数组。

League.java

public class League<T extends Team> {
    public String name;
    private List<T> teams = new ArrayList<>();

    public League(String name) {
        this.name = name;
    }

    public boolean add(T team) {
        if (teams.contains(team)) {
            return false;
        }

        return teams.add(team);
    }

    public void showLeagueTable() {
        Collections.sort(this.teams);

        for (T t: teams) {
            System.out.println(t.getName() + ": " + t.ranking());
        }
    }
}

Team.java

public class Team<T extends Player> implements Comparable<Team<T>> {
     private String name;
     int played = 0;
     int won = 0;
     int lost = 0;
     int tied = 0;

     private ArrayList<T> members = new ArrayList<>();

    public Team(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public boolean addPlayer(T player) {
        if (members.contains(player)) {
            System.out.println(player.getName() + " is already on this team");
            return false;
        } else {
            members.add(player);
            System.out.println(player.getName() + " picked for team " + this.name);

            return true;
        }
    }

    public int numPlayers() {
        return this.members.size();
    }

    public void matchResult(Team<T> opponent, int ourScore, int theirScore) {
        String message;
        if (ourScore > theirScore) {
            won++;
            message = " beat ";
        } else if (ourScore == theirScore) {
            tied++;
            message = " drew with ";
        } else {
            lost++;
            message = " lost to ";
        }

        played++;

        if (opponent != null) {
            System.out.println(this.getName() + message + opponent.getName());
            opponent.matchResult(null, theirScore, ourScore);
        }
    }

    public int ranking() {
        return (won * 2) + tied;
    }

    @Override
    public int compareTo(Team<T> team) {
        return Integer.compare(team.ranking(), this.ranking());
    }
}

Player.java

public class Player {
    private String name;

    public Player(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

但在 Collections.sort(this.teams); 行中来自类(class)League ,我收到警告 Unchecked method 'sort(List<T>)' invocation ,我读过,也许问题是我没有在我的 Team 类中使用 Type 实现 Comparable 接口(interface),但我做到了,您可以在以下行看到它:

public class Team<T extends Player> implements Comparable<Team<T>>

谁能帮帮我,谢谢!

最佳答案

这里有一个针对您特定问题的完全可行的代码:
它消除了警告和错误。
第一阶段:删除类似行为
第 2 阶段:尝试在没有警告的情况下编译
第 3 阶段:尝试真正的新分配:很重要,因为,如果您不做任何新的事情,则不会使用 T 泛型,并且您无法检测到错误。
第 4 阶段:添加可比较的行为。

最终来源[参见来源中的A) B) 和C) 错误]

League.java

package test;

import java.util.ArrayList;
import java.util.List;
import test.Team;
import java.util.Collections;

// -- A) missing precision about Team , Team based on Player 
// -- public class League<T extends Team> 
public class League<T extends Team<E>, E extends Player>
{
    public String name;
    
    
    // B) ! miss <T> after new : 
    //    private List<T> teams = new ArrayList<>();
    private List<T> teams = new ArrayList<T>();
    
    

    public League(String name) {
        this.name = name;
    }

    public boolean add(T team) {
        if (teams.contains(team)) {
            return false;
        }

        return teams.add(team);
    }

    public void showLeagueTable() {
        Collections.sort(this.teams);

        for (T t: teams) {
            System.out.println(t.getName() + ": " + t.ranking());
        }
    }
}

团队.java

    package test;
    
    
    import java.util.ArrayList;
    
       
    public class Team<T extends Player> implements Comparable<Team<T>> {
           
        private String name;
        int played = 0;
        int won = 0;
        int lost = 0;
        int tied = 0;
    
        // C) !! MISS <T> after new ArrayList
        // private ArrayList<T> members = new ArrayList<>();
        private ArrayList<T> members = new ArrayList<T>();
    
    
        @Override
        public int compareTo(Team<T> team) {
            return Integer.compare(team.ranking(), this.ranking());
        }
        
        
        
       public Team(String name) {
           this.name = name;
       }
    
       public String getName() {
           return name;
       }
    
       public boolean addPlayer(T player) {
           if (members.contains(player)) {
               System.out.println(player.getName() + " is already on this team");
               return false;
           } else {
               members.add(player);
               System.out.println(player.getName() + " picked for team " + this.name);
    
               return true;
           }
       }
    
       public int numPlayers() {
           return this.members.size();
       }
       
       public void showPlayers() {
           for (T element : members) {
               System.out.println(element.getName());
           }
       }
    
       public void matchResult(Team<T> opponent, int ourScore, int theirScore) {
           String message;
           if (ourScore > theirScore) {
               won++;
               message = " beat ";
           } else if (ourScore == theirScore) {
               tied++;
               message = " drew with ";
           } else {
               lost++;
               message = " lost to ";
           }
    
           played++;
    
           if (opponent != null) {
               System.out.println(this.getName() + message + opponent.getName());
               opponent.matchResult(null, theirScore, ourScore);
           }
       }
    
       public int ranking() {
           return (won * 2) + tied;
       }
    
    }

Player.java

package test;

public class Player {
    private String name;

    public Player(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

测试.java

package test;

import test.League;
import test.Team;
import test.Player;

public class Test {

     Player p1;
     Player p2;
     Player p3;
     Player p4;
     Player p5;
     Player p6;
     Player p7;
     Player p8;
     Player p9;
        
     Team<Player> t1;
     Team<Player> t2;
     Team<Player> t3;
     Team<Player> t4;

    
    public void test() {
        
        System.out.println("RUNNING TEST");
        
         p1=new Player("Mike");
         p2=new Player("John");
         p3=new Player("Jenny");
         p4=new Player("Sunny");
         p5=new Player("Mike");
         p6=new Player("Jeremy");
         p7=new Player("Gwen");
         p8=new Player("Hector");
         p9=new Player("Henry");
            
         t1=new Team<Player>("Team1");
         t2=new Team<Player>("Team2");
         t3=new Team<Player>("Team3");
         t4=new Team<Player>("Team4");
         
         t1.addPlayer(p1);
         t1.addPlayer(p2);
         t2.addPlayer(p3);
         t2.addPlayer(p4);
         t2.addPlayer(p5);
         t3.addPlayer(p6);
         t3.addPlayer(p7);
         t4.addPlayer(p8);
         t4.addPlayer(p9);
         
    
         // test show players
         t1.showPlayers();
         System.out.println("------------");
         System.out.println("num players in team is "+t1.numPlayers());
        
         System.out.println("---adding team in league ---------");
         League<Team<Player>, Player> g1=new League<Team<Player>, Player>("League 1");
         g1.add(t1);
         g1.add(t2);
         
         League<Team<Player>, Player> g2=new League<Team<Player>, Player>("League 2");
         g2.add(t3);
         g2.add(t4);
         
         System.out.println("---settings results ---------");
         t1.matchResult(t2, 2, 8);
         t2.matchResult(t1, 1, 7);
         t3.matchResult(t4, 4, 5);
         t3.matchResult(t4, 4, 0);
         
         System.out.println("-----League 1---------");
         g1.showLeagueTable();
         System.out.println("-----League 2---------");
         g2.showLeagueTable();
         
     
         
         
    }
    
}

Main.java

import test.Test;

public class Main  
{
   
    public static void main(String[] args) {        
      System.out.println("running MAIn");
      Test test = new Test();
      test.test();
    }    
}

关于java - Java 11 中使用泛型进行未经检查的方法 'sort(List<T>)' 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58721790/

相关文章:

python - Pygame:get_at 始终返回 'None'

c# - 在派生类中调用泛型函数的更好方法

Java jButton 在开始 Activity 前需要点击两次

java - query.list 和 query.iterate 的区别

java - 如何在 Eclipse IDE 中将 JSON 关联到字符串

oop - fortran 2003 中的运行时多态性

python - 如何在 python 函数中将对象的实例作为参数传递?

java - Hamcrest 泛型 hell #2 : iterableWithSize gives errror "is not applicable for the arguments"

java - 类型参数不起作用吗?

java - SoapUI 和 Groovy : How to call a compiled jar file as if from the command line?