Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更改变量所指向的实例?_Java_Generics - Fatal编程技术网

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

Java 如何更改变量所指向的实例?,java,generics,Java,Generics,我知道我可以创建一个不同的变量,但我只是好奇是否可以更改当前的d变量,使其使用Deque。将d声明为Deque,以便可以将其分配给任何实例。您必须注意每个实例的dereferencetype和instanceof,以便对它们进行特殊使用 这是不可能的。您可以尝试以下方法: Deque<String> d = new Deque<String>(); d.pushLeft("Datastructuren"); d.pushLeft("is"); d.pushRight("h

我知道我可以创建一个不同的变量,但我只是好奇是否可以更改当前的d变量,使其使用Deque。

将d声明为Deque,以便可以将其分配给任何实例。您必须注意每个实例的dereferencetype和instanceof,以便对它们进行特殊使用

这是不可能的。您可以尝试以下方法:

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 + " ");
}

实现这一点的唯一现实方法是,如果集合具有对象的下限

作为比较,如果我们使用一个类似于香草系列的列表,我们可以做到:

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

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

你不应该试图给出一个无用的解决方案来解决一个程序设计语言不适用的问题。在这种情况下,答案是根本不可能的

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

相反,您可以简单地使用另一个变量。 如果您只想安全地填充队列类型,而不考虑队列类型,则可以如下所示进行重构 最后,还不清楚您想用这段代码做什么。如果只是学习一个变量是如何工作的,那么第二个变量会做得最好。如果不是,重构将是一个想法,也许通用方法将有助于以后处理队列

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

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

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

在此重构中,您不能在fill方法之外添加或替换d中的元素,因为编译器无法再检查类型。

为什么要这样做?您应该在使用deque之前具体地键入它,而不是在使用它时。如果需要将其设置为新deque,为什么要声明deque类型的变量?您不能。你宣布d为Deque。这就是它的类型。如果你想让一个值指向一个Deque,你必须声明一个新的、不同的、正确类型的变量。@scarecrow-:这是一个可怕的想法。在适当的时候使用强输入。问题变成了,为什么OP认为这是合适的。@稻草人-但正确的方法不是离开,而是去束缚。但是泛型是没有用的。你不能在泛型上应用添加元素的方法,因为编译器没有机会检查类型是否正确。@ArneBurmeister:这在其他数据结构中也可以使用。我会在编辑中明确说明的。啊,我很困惑,想过了吗?扩展对象。这是可行的,但最终与Deque相同,因为没有可能的超类型对象。
Deque<? super Object> d = new Deque<>();
// Possible
d.pushLeft("Datastructuren");

// Not type safe in the least
String first = d.get(0);
List<? super Object> foo = new ArrayList<>();

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

for(Object o : foo) {
    System.out.println(o);
}
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;
}