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