3

作为一个大学项目,我正在编写一个Java程序,它从一个Player类派生类并将它们存储在一个Club类中。该俱乐部是一个板球俱乐部(因此变量/类名称)。下面的类仍然只是部分构建,但它编译并且对于我需要解决的问题已经足够完整。在Java中修复“发现未检查的转换”警告?

import java.util.*; 

public class Club{ 
    private String name; 
    private List<Player> players; 
    private Set<Player> playersAverage; 
    private int regID; 

    @SuppressWarnings(value = {"unchecked"}) 
    public Club(){ 
     this.name = ""; 
     this.players = new ArrayList<Player>(); 
     this.playersAverage = new TreeSet<Player>(new BattingAverageComparator()); 
     this.regID = 1; 
    } 

    @SuppressWarnings(value = {"unchecked"}) 
    public Club(String name){ 
     this.name = name; 
     this.players = new ArrayList<Player>(); 
     this.playersAverage = new TreeSet<Player>(new BattingAverageComparator()); 
     this.regID = 1; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 

    public boolean registerPlayer(Player player) throws UninitialisedObjectException, NullPointerException{ 
     if(!(validPlayer(player))){ 
      throw new UninitialisedObjectException("attempted to add an uninitialised player object to Club.players"); 
     } 
     if(!(this.players.contains(player))){ 
      player.setRegID(this.regID); 
      this.regID++; 
      for(int i = 0; i < this.players.size(); i++){ 
       if(player.compareTo(this.players.get(i)) > 0){ 
        this.players.add(i,player); 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

    public boolean removePlayer(Player player) throws NullPointerException{ 
     return this.players.remove(player); 
    } 

    public String getPlayerDetails(int regID) throws InvalidRegistrationIDException{ 
     String s = ""; 
     for (int i=0; i < this.players.size(); i++){ 
      if (this.players.get(i).getRegID() == regID){ 
       s = this.players.get(i).toString(); 
       break; 
      } 
     } 
     if(s == ""){ 
      throw new InvalidRegistrationIDException("getPlayerDetails() attempted on invalid regID"); 
     } 
     return s; 
    } 

    private boolean validPlayer(Player player){ 
     return player.getFirstName()!="" || player.getLastName()!="" || player.getAge()>0 || player.getHeight()>0 || player.getWeight()>0; 
    } 

    public void averages(BattingAverageComparator compareAveragesOf){ 
    } 
} 

使用以下比较:

import java.util.*; 

public class BattingAverageComparator implements Comparator{ 
    public int compare(Object obj1,Object obj2) throws IllegalArgumentException{ 
     if(!(obj1 instanceof Player) || !(obj2 instanceof Player)){ 
      throw new IllegalArgumentException("BattingAverageComparator cannot compare objects that are not of, or do not extend, the Player class."); 
     } 
     Player thisPlayer = (Player) obj1; 
     Player thatPlayer = (Player) obj2; 
     if(thisPlayer.getDismissals() == 0 && thatPlayer.getDismissals() == 0){ 
      if(thisPlayer.getRuns() > thatPlayer.getRuns()){ 
       return 1; 
      } 
      else if (thisPlayer.getRuns() < thatPlayer.getRuns()){ 
       return -1; 
      } 
      else{ 
       return thisPlayer.compareTo(thatPlayer); 
      } 
     } 
     else if(thisPlayer.getDismissals() == 0 && thatPlayer.getDismissals() > 0){ 
      return -1; 
     } 
     else if(thisPlayer.getDismissals() > 0 && thatPlayer.getDismissals() == 0){ 
      return 1; 
     } 
     else{ 
      double thisAverage = thisPlayer.getRuns()/thisPlayer.getDismissals(); 
      double thatAverage = thatPlayer.getRuns()/thatPlayer.getDismissals(); 
      if(thisAverage > thatAverage){ 
       return 1; 
      } 
      else if(thisAverage == thatAverage){//need to make a double threshold 
       return 0; 
      } 
      else{ 
       return -1; 
      } 
     } 
    } 

    public boolean equals(Object obj){ 
     return obj instanceof BattingAverageComparator; 
    } 
} 

下面的警告出现两个构造:

Club.java:13: warning: [unchecked] unchecked conversion found : BattingAverageComparator 
required: java.util.Comparator<? super Player> 
this.playersAverage = new TreeSet<Player>(new BattingAverageComparator()); 

有我编译下面的类时,接收两个未选中的警告无论如何解决这个问题,而不是压制警告?

如果您需要更多信息,我会发布它。该课程中有不少课程,我认为目前没有必要全部发布。

回答

7

的问题是在这里:

public class BattingAverageComparator implements Comparator{ 

你把这个声明为原料比较,但你在一个通用型的<Player>

喂养

因此将其更改为

public class BattingAverageComparator implements Comparator<Player>{ 
+2

+1对于一个非常好的解释。希望你不要介意我在第二段中加入反斜杠'',这样它就不会被解释为HTML。 – 2012-04-21 21:12:02

+0

是的,我明白了。谢谢。 – rota 2012-04-21 21:18:48

+0

@AdamMihalcin我甚至没有想到!大声笑 – Lucas 2012-04-22 00:26:49

1

是的,使用泛型类型:

public class BattingAverageComparator implements Comparator<Player>{ 
    public int compare(Player obj1,Player obj2){ 
    //etc. 
    } 
} 
+0

我在将Player对象传入比较时遇到问题。我不认为要在那里添加泛型类型。谢谢。 – rota 2012-04-21 21:19:47