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. –

+0

Да, я вижу. Спасибо. – rota

+0

@AdamMihalcin Я даже не думал об этом! Лол – Lucas

1

Да, использовать общий тип:

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

У меня возникли проблемы с передачей объектов Игрока в сравнение. Я не думал добавлять туда общий тип. Спасибо. – rota

Смежные вопросы