不安全的操作......用-Xlint重新编译:未经检查......我似乎无法理解操作不安全的原因

时间:2014-05-04 17:45:48

标签: java arraylist

我已经阅读了很多关于xlint的消息来源,这是一个不安全的操作内容,而且很多内容都说了一些:

你可能用

初始化了你的arraylist
Arraylist x = new Arraylist();

相反,做,

List<String> x = new ArrayList<String>();

这一切都很好,花花公子,但在这种情况下,这根本不能帮助我。在我的项目中,我试图制作一个回合制的游戏,而且我有一个Commander类,它有一个单位和建筑物的arraylist。单位是单独的对象,带有子类。构造子类时,Commander对象是一个参数,这就是我使用它的原因,我认为这很好吗?问题在于:

public void buyUnit(int u)
{
    if (u < 1 || u > 23)
    {
        if (u == 1)
            this.getUnits().add(new Grunt(this));
        if (u == 2)
            this.getUnits().add(new Rifleman(this));
        if (u == 3)
            this.getUnits().add(new Scout(this));
        if (u == 4)
            this.getUnits().add(new Mortar(this));
        if (u == 5)
            this.getUnits().add(new FlakTrooper(this));
        if (u == 6)
            this.getUnits().add(new RPG(this));
        if (u == 7)
            this.getUnits().add(new Sniper(this));
        if (u == 8)
            this.getUnits().add(new Minigunner(this));
        if (u == 9)
            this.getUnits().add(new Humvee(this));
        if (u == 10)
            this.getUnits().add(new Tank(this));
        if (u == 11)
            this.getUnits().add(new Artillery(this));
        if (u == 12)
            this.getUnits().add(new MissileBattery(this));
        if (u == 13)
            this.getUnits().add(new GattlingGun(this));
        if (u == 14)
            this.getUnits().add(new IFV(this));
        if (u == 15)
            this.getUnits().add(new TankBuster(this));
        if (u == 16)
            this.getUnits().add(new Flamethrower(this));
        if (u == 17)
            this.getUnits().add(new Fighter(this));
        if (u == 18)
            this.getUnits().add(new Bomber(this));
        if (u == 19)
            this.getUnits().add(new Gunship(this));
        if (u == 20)
            this.getUnits().add(new Gunner(this));
        if (u == 21)
            this.getUnits().add(new Jet(this));
        if (u == 22)
            this.getUnits().add(new Chopper(this));
        if (u == 23)
            this.getUnits().add(new Harrier(this)); 
        this.loseBalance(units.get(units.size() - 1).getCost());
    }

我确信有更好的方法可以做到这一点,而不是使用整数参数,但我更喜欢在保持这种情况下解决问题的方法。使用loseBalance(int b)方法的最后一行很好,因为当我发表评论时我得到了错误。那么问题是什么?


好的Marco13指出了有关getUnits()方法的一些内容,即:

public ArrayList getUnits()
{
    return units;
}

只返回单位的ArrayList。我仍然不明白为什么它现在有效,但我改变了:

this.getUnits(). ...

units. ...

我想当我能够在课堂上访问它时,尝试首先返回Arraylist是愚蠢的,但这仍然无法解释为什么当我尝试返回ecact时出现错误相同的数组,但只能使用方法而不是引用本身。

2 个答案:

答案 0 :(得分:2)

您使用了生成警告的ArrayList原始类型。

  

切勿将参数化类型与原始类型混合使用。

public ArrayList getUnits()
{
    return units;
}

答案 1 :(得分:0)

你不是在问,但如果你有这样的限制:

if (u < 1 || u > 23)
    {
        if (u == 1)
            this.getUnits().add(new Grunt(this));
        if (u == 2)
            this.getUnits().add(new Rifleman(this));
    }

然后内部if将永远不会为真,因为为了测试内部ifs,你必须小于1或大于23。 它应该是

if (u >= 1 && u <= 23)

这是第一件事,第二件事,使用

if(u==1){ 
    //code
}else if(u==2) {
    //code
}

而不是

if(u==1){}
if(u==2){}

因为即使已经匹配,您也会检查他们中的每个人。 在你的情况下,我建议使用

switch(u)
{
    case 1:
        //code
        break;
    case 2:
        //code
        break;
    case 3:
        //code
        break;
    .
    .
    .
    default:
}

没有if (u < 1 || u > 23)