【问题标题】:Fix "unchecked conversion found" warning in Java?修复 Java 中的“发现未经检查的转换”警告?
【发布时间】:2012-04-21 21:05:09
【问题描述】:

作为一个大学项目,我正在编写一个 Java 程序,该程序采用派生自 Player 类的类并将它们存储在 Club 类中。俱乐部是一个板球俱乐部(因此变量/类名)。下面的类仍然只是部分构建,但它编译并且对于我需要解决的问题来说足够完整。在编译以下类时,我收到两个“未检查”警告:

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());

除了取消警告之外,还有什么方法可以解决这个问题吗?

如果您需要更多信息,我会发布。程序里有很多类,我认为目前没有必要全部发布。

【问题讨论】:

    标签: java compiler-warnings comparator unchecked unchecked-conversion


    【解决方案1】:

    问题出在这里:

    public class BattingAverageComparator implements Comparator{
    

    您将其声明为原始比较器,但您输入的是&lt;Player&gt; 的泛型类型

    所以改成

    public class BattingAverageComparator implements Comparator<Player>{
    

    【讨论】:

    • +1 以获得非常好的解释。希望你不介意我在第二段中在 &lt;Player&gt; 周围添加了反引号,这样它就不会被解释为 HTML。
    • @AdamMihalcin 我什至没有想到!大声笑
    【解决方案2】:

    是的,使用泛型类型:

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

    【讨论】:

    • 我在将 Player 对象传递给比较时遇到了问题。我没想到在那里添加泛型类型。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多