2016-09-30 7 views
-1
Deque<String> d = new Deque<String>(); 

私のような何かにそれ以降のコードで変更したい:私はそのようにそれを行うたびに、私は取得変数が指し示しているインスタンスをどのように変更できますか?

d = new Deque<Integer>();

incompatible types Deque<Integer> cannot be converted to Deque<String>

どのように私はそれを作ることができます私はdDeque<Integer>に割り当てることができますか?

私は次のことを達成しようとしている:

Deque<String> d = new Deque<String>(); 
d.pushLeft("Datastructuren"); 
d.pushLeft("is"); 
d.pushRight("heel"); 
d.pushRight("leuk"); 
d.pushLeft("of"); 
d.pushRight("niet?"); 
d.changeLeft(5, "test"); 
d.changeRight(3, "een"); 
d.changeLeft(2, "Dit"); 
d.changeRight(4, "is"); 
d.popRight(); 
d.popLeft(); 

for (String i : d) { 
    System.out.print(i + " "); 
} 

d = new Deque<Integer>(); 
d.pushLeft(67); 
d.pushLeft(1); 
d.pushLeft(13); 
d.pushRight(18); 
d.pushRight(10); 
d.pushRight(2); 
d.pushLeft(29); 
d.pushRight(88); 
d.changeLeft(5, 25); 
d.changeRight(1, 17); 
d.popRight(); 
d.changeLeft(8, 18); 
d.changeRight(5, 19); 
d.popLeft(); 

for (int i : d) { 
    System.out.print(i + " "); 
} 

私は別の変数を作ることができます知っているが、私はそれがDeque<Integer>を使用するので、私は現在のd変数を変更することができればちょうど興味がありました。

+3

なぜこのようなことをしたいですか? deque *は、*使用している*ときではなく*使用する前に*入力します。 – Makoto

+0

'Deque '型の変数を 'new Deque ()'に設定する必要がある場合は、なぜ宣言しますか? – khelwood

+0

できません。あなたはdを 'Deque 'と宣言しました。それは** **タイプです。値が 'Deque 'を指している場合は、正しいタイプの新しい変数を宣言する必要があります。 – Frecklefoot

答えて

0

あなたはを求める質問に対する(役に立たない)の溶液を得試みるべきではありませんプログラミング言語が作られていないもの。この場合、答えは単にです!

本当の質問は:なぜそうしたいですか?

  • 代わりに、別の変数を使用することもできます。
  • あなただけのキュータイプが安全いっぱいにしたいが、あなたは終わり
  • 以下

のようにリファクタリングすることができますタイプに関係なく読めば、あなたがこのコードで何をしたいのか、本当に明確ではありません。 Dequeが2番目の変数よりもどのように機能するかを知っていれば、最も効果的です。そうでない場合は、リファクタリングがアイデアとなり、後でジェネリックメソッドがキューを処理するのに役立つかもしれません。

Deque<?> d = fillWithString(); 

for (Object i : d) { 
    System.out.print(i + " "); 
} 

d = fillWithInt(); 

for (Object i : d) { 
    System.out.print(i + " "); 
} 

private Deque<String> fillWithString() { 
    Deque<String> d = new Deque<String>(); 
    d.pushLeft("Datastructuren"); 
    d.pushLeft("is"); 
    d.pushRight("heel"); 
    d.pushRight("leuk"); 
    d.pushLeft("of"); 
    d.pushRight("niet?"); 
    d.changeLeft(5, "test"); 
    d.changeRight(3, "een"); 
    d.changeLeft(2, "Dit"); 
    d.changeRight(4, "is"); 
    d.popRight(); 
    d.popLeft(); 
    return d; 
} 

private Deque<Integer> fillWithInt() { 
    Deque<Integer> d = new Deque<Integer>(); 
    d.pushLeft(67); 
    d.pushLeft(1); 
    d.pushLeft(13); 
    d.pushRight(18); 
    d.pushRight(10); 
    d.pushRight(2); 
    d.pushLeft(29); 
    d.pushRight(88); 
    d.changeLeft(5, 25); 
    d.changeRight(1, 17); 
    d.popRight(); 
    d.changeLeft(8, 18); 
    d.changeRight(5, 19); 
    d.popLeft(); 
    return d; 
} 

コンパイラは、任意のより多くの種類を確認することができないとしてあなたが追加したり、このリファクタリングでfillメソッドの外d内の要素を置き換えることはできません。

-1

dをDeque<Object>と宣言し、任意のインスタンスに割り当てることができます。インスタンスごとにinstanceofを使用して、それぞれのインスタンスのタイプを特別に使用するように、それぞれのインスタンスのタイプに注意する必要があります。

+0

ジェネリック医薬品を持たないものよりも本当に良いわけではありません –

-3

可能ではありません。あなたはこれを試すことができます。

Deque d = new Deque<String>(); 
+1

しかし、ジェネリックよりも役に立たないです。 –

0

あなたのコレクションはObjectの下限を持っている場合はこれを達成することができる唯一の現実的な方法です。

Deque<? super Object> d = new Deque<>(); 

本の利点を使用すると、型の安全性を損なうことなく、あなたがやりたいことができるということです。 の欠点dからObject以外の値を抽出できないということです。比較として

// Possible 
d.pushLeft("Datastructuren"); 

// Not type safe in the least 
String first = d.get(0); 

我々はListのようなバニラコレクションを使用した場合、我々はこれを実現できます。

List<? super Object> foo = new ArrayList<>(); 

foo.add(1); 
foo.add(2); 
foo.add("cabbage"); 

for(Object o : foo) { 
    System.out.println(o); 
} 
+0

コンパイラは型が正しいかどうかチェックする機会がないので、その上に要素を追加するメソッドを適用することはできません。 –

+0

@ArneBurmeister:これは他のデータ構造でもうまく動作します。私はそれを明示的に編集します。 – Makoto

+0

ああ、混乱して、「約」と思った?オブジェクトを拡張します。これはうまく動作しますが、 'Deque 'と同じですが、 'Object'のスーパータイプはありません。 –

関連する問題