0

我是一个尝试学习java的初学者!

我目前正在尝试《Building Skills in Object-Oriented Design》一书,目前正在研究轮盘赌。

我有一个类 Bin,它构造了一个包含结果对象的 TreeSet。它们是在 Outcome 类中构建的。

现在,我正在研究 Wheel 类,在这里我使用了 new Vector(38) ,我用 38 个 new Bin() 填充了它。

现在,问题。

我想创建一个从 Vector 中检索 Bin 对象的方法。

Bin get(int bin){
    return  bins.elementAt(bin);
}

这不起作用,Eclipse 建议进行两个修复:

1:添加演员表

2:将 Bin 更改为 Object

这里发生了什么?为什么我不能以我想要的方式归还 Bin?当我投射或更改为对象时,它不起作用。

这是结果类

这是 Bin 类

这是轮子类

package Roulette;

import java.util.Random;
import java.util.Vector;

public class Wheel {

Vector bins;
Random rng;


Wheel(Random rng){
    rng =  new Random();

    bins = new Vector(38);
    for (int i=0; i<38; i++){
        bins.add(i, new Bin());
    }
}

void addOutcome(int bin, Outcome outcome){
    this.bins.elementAt(bin).add(outcome);
}

Bin next(){
    int rand = rng.nextInt(38);

    return bins.elementAt(rand);

}

Bin get(int bin){
    return  bins.elementAt(bin);
}

}
4

3 回答 3

2

编译器在运行时不知道你会得到什么bins.elementAt()。由于您尚未定义类型,因此它需要任何类(Object实例)的对象,该对象可能属于也可能不属于 class Bin

所以,你所拥有的是(对于编译器)喜欢

  Object a = new Bin();
  Bin b = a;

由于编译器不确定,它需要您对其进行强制转换以确保它将返回适当的类型(或者如果出现强制转换错误则失败)。无论如何,您必须明确表示

  Object a = new Bin();
  Bin b = (Bin) a;    // compiles and works

  Object a = new String("Hello world");
  Bin b = (Bin) a;    // compiles but fails at runtime with ClassCastException.

另一种方法是使用泛型来指定Vector将只包含Bin实例

  Vector<Bin> bins = new Vector<Bin>();

这样编译器将确保bins.getElement()返回一个Bin对象。

于 2013-04-25T10:51:02.783 回答
1

你应该转

Vector bins;

进入

Vector<Bin> bins;

那么它应该工作

于 2013-04-25T10:47:13.777 回答
1

您必须查看 Java-Generics(http://docs.oracle.com/javase/tutorial/java/generics/index.html)。

你必须改变你的线路

Vector bins;

Vector<Bin> bins;

这需要你改变你的初始化

bins = new Vector(38);

bins = new Vector<Bin>(38);

希望我能帮助你。

于 2013-04-25T10:53:05.490 回答