如何更改变量指向的实例?

时间:2016-09-30 15:08:23

标签: java generics

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

我希望稍后在代码中将其更改为:

d = new Deque<Integer>();

每当我这样做时,我得到:

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

如何让它发挥作用,以便我可以将d分配给Deque<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 + " ");
}

我知道我可以创建一个不同的变量,但我很好奇我是否可以更改当前的d变量,以便使用Deque<Integer>

4 个答案:

答案 0 :(得分:0)

唯一可行的方法是,如果您的收藏集的下限为ActiveSheet.Range("B1").Value = DateSerial(Year(ActiveSheet.Range("A1")), 3, 31)

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

答案 1 :(得分:0)

你不应该试图为一个问题提供一个(无用的)解决方案,要求提供一些编程语言。在这种情况下,答案就是没办法!

真正的问题是:你为什么要这样做?

  • 相反,你可以简单地使用另一个变量。
  • 如果您只是想填充队列类型安全但是无论类型如何都可以读取,如下所示

最后,您还不清楚要对此代码执行什么操作。如果它只是学习Deque如何工作而不是第二个变量将最好地完成工作。如果没有,重构将是一个想法,也许通用的方法将有助于稍后处理队列。

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;
}

由于编译器无法再检查类型,因此无法在此重构中的填充方法之外添加或替换d中的元素。

答案 2 :(得分:-1)

将d声明为Deque<Object>,以便将其分配给任何实例。您必须为每个实例关注每个实例的de refer类型以及每个实例的特殊用途。

答案 3 :(得分:-3)

不可能。你可以试试这个:

Deque d = new Deque<String>();