0

Javaを勉強中の初心者です!

私は現在、「Building Skills in Object-Oriented Design」という本を試しており、ルーレットに取り組んでいます。

Outcome オブジェクトを含む TreeSet を構築するクラス Bin があります。それらは Outcome クラスで構築されます。

今、私は Wheel クラスに取り組んでいます。ここでは、38 個の新しい Bin() s で埋めている new Vector(38) を使用しています。

さて本題。

Vector から Bin オブジェクトを取得するメソッドを作成したいと考えています。

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

これは機能せず、Eclipse は 2 つの修正を提案しています。

1: キャストを追加

2: ビンをオブジェクトに変更

ここで何が起こっているのですか?思い通りにビンを返せないのはなぜ?オブジェクトにキャストまたは変更すると、機能しません。

これは結果クラスです

これがBinクラスです

これは Wheel クラスです

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()。型を定義していないため、 classObjectである場合とない場合がある任意のクラス (インスタンス)のオブジェクトが必要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

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 に答える
1

あなたは回るべきです

Vector bins;

の中へ

Vector<Bin> bins;

それならうまくいくはずです

于 2013-04-25T10:47:13.777 に答える