私はトランプのデッキを表すクラスを作ろうとしてきました。でも、どんなカードでもいいように作りたかったので、どの種類のカードを収納して、シャッフルして、一度に1枚ずつ引くことができるのかを知る必要はありません。通常のトランプ、またはトレーディングカード。このために、私は聞いたことはあるが使用したことのないもの、つまりジェネリックを試してきました。
しかし、私はそれを機能させることを試みてまったく運がありませんでした。カードを引くときに、インスタンス化したり、カードにデータを入力したり、正しいタイプを返したりすることはありません。ミキシングとマッチングを試しましたが、うまく機能しません。
バグのある古いコードはスペースを節約するために切り捨てられました。以前の編集を見てください。要約:私はTの代わりにCardableを使用し、一般的にジェネリックを表現することができませんでした。
それで、これはどのように機能するのでしょうか、私はジェネリックに完全に慣れていません。私はいたるところを見回していて、型消去について聞き続けています。クラスリテラルはパラメータであり、yadda yaddaである必要があります...しかし、ArrayListはどのようにそれを行うのでしょうか。ArrayList<String>()
入力するだけで、ばかげたようなものを必要とせずに機能するのはなぜArrayList<String>(String.GetClass())
ですか?
御時間ありがとうございます。
編集:Cardableは、デッキに入れることができるすべてのカードが拡張されるクラスです。
Edit2:Perceptionの提案によりコードは修正されましたが、デッキにデータを入力するためにどのように呼び出すことができるかわかりません。現在、配列を受け入れることができますが、内部にあると便利であり、ファクトリメソッド全体を把握できるかどうかは完全にはわかりません。
public class Deck<T extends Cardable>
{
private ArrayList<T> cardsInDeck;
public Deck()
{
cardsInDeck = new ArrayList<T>();
}
public void populate( T[] newCards )
{
cardsInDeck.clear();
for( T card : newCards )
{
cardsInDeck.add( card );
}
shuffle();
}
public T drawCard()
{
T card = null;
try
{
card = cardsInDeck.get( 0 );
}
catch( IndexOutOfBoundsException e )
{
System.out.println( "Ran out of Cards" );
e.printStackTrace();
}
cardsInDeck.remove( 0 );
return card;
}
public void shuffle()
{
ArrayList<T> newDeck = new ArrayList<T>();
Random rand = new Random();
while( !cardsInDeck.isEmpty() )
{
int index = rand.nextInt( cardsInDeck.size() );
newDeck.add( cardsInDeck.get( index ) );
cardsInDeck.remove( index );
}
cardsInDeck = newDeck;
}
public int getSize()
{
return cardsInDeck.size();
}
}