Java 11中具有泛型的未经检查的方法'sort(List <T>)'调用

我有三个班级,分别是LeagueTeamPlayer,联赛有一个由球队组成的数组,我有一个名为showLeaguetable的方法,该方法显示了按{ {1}}(这是ranking类中存在的一种方法),并且团队类具有一组参与者。

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);中,我得到了警告League,我读到也许是因为我没有实现Comparable接口类的团队,但是我做到了,您可以在一行中看到它:

Unchecked method 'sort(List<T>)' invocation

有人可以帮我吗,谢谢!

skywwh123 回答:Java 11中具有泛型的未经检查的方法'sort(List <T>)'调用

这里是针对您特定问题的完全可行的代码:
它消除了警告和错误。
阶段1:删除可比较的行为
阶段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());
        }
    }
}

Team.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;
    }
}

Test.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,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();
    }    
}
本文链接:https://www.f2er.com/3155500.html

大家都在问