Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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 寻求关于类型擦除和类型推断的澄清 类可撤消{ T值; 德克历史; 可撤消(T、T、Deque历史){ 该值=t; 这就是历史; } 静态可撤消的(T){ 返回新的可撤消(t,newlinkedlist()); } 公共可撤消平面映射(函数映射器){ 可撤消r=映射器。应用(值); Deque newHistory=newlinkedlist(); newHistory.addAll(历史); newHistory.addAll(r.history); 返回新的可撤消(r.value,newHistory); } 公共可撤消撤消撤消(){ Deque newHistory=newlinkedlist(this.history); R; 试一试{ r=(r)newHistory.removeLast();//行A }捕获(无接触元素例外e){ 抛出新的CannotUndoException(); } 返回新的可撤消(r,newHistory); } }_Java_Generics_Type Erasure - Fatal编程技术网

Java 寻求关于类型擦除和类型推断的澄清 类可撤消{ T值; 德克历史; 可撤消(T、T、Deque历史){ 该值=t; 这就是历史; } 静态可撤消的(T){ 返回新的可撤消(t,newlinkedlist()); } 公共可撤消平面映射(函数映射器){ 可撤消r=映射器。应用(值); Deque newHistory=newlinkedlist(); newHistory.addAll(历史); newHistory.addAll(r.history); 返回新的可撤消(r.value,newHistory); } 公共可撤消撤消撤消(){ Deque newHistory=newlinkedlist(this.history); R; 试一试{ r=(r)newHistory.removeLast();//行A }捕获(无接触元素例外e){ 抛出新的CannotUndoException(); } 返回新的可撤消(r,newHistory); } }

Java 寻求关于类型擦除和类型推断的澄清 类可撤消{ T值; 德克历史; 可撤消(T、T、Deque历史){ 该值=t; 这就是历史; } 静态可撤消的(T){ 返回新的可撤消(t,newlinkedlist()); } 公共可撤消平面映射(函数映射器){ 可撤消r=映射器。应用(值); Deque newHistory=newlinkedlist(); newHistory.addAll(历史); newHistory.addAll(r.history); 返回新的可撤消(r.value,newHistory); } 公共可撤消撤消撤消(){ Deque newHistory=newlinkedlist(this.history); R; 试一试{ r=(r)newHistory.removeLast();//行A }捕获(无接触元素例外e){ 抛出新的CannotUndoException(); } 返回新的可撤消(r,newHistory); } },java,generics,type-erasure,Java,Generics,Type Erasure,给出上面的代码片段,假设我们保留A行,忽略编译警告。如果我们 class Undoable<T> { T value; Deque<Object> history; Undoable(T t, Deque<Object> history) { this.value = t; this.history = history; } static <T> Undoable<T> of(T

给出上面的代码片段,假设我们保留A行,忽略编译警告。如果我们

class Undoable<T> {
  T value;
  Deque<Object> history;
      
  Undoable(T t, Deque<Object> history) {
    this.value = t;
    this.history = history;
  }
  
  static <T> Undoable<T> of(T t) {
    return new Undoable<T>(t, new LinkedList<Object>());
  }

  public <R> Undoable<R> flatMap(Function<T, Undoable<R>> mapper) {
    Undoable<R> r = mapper.apply(value);
    Deque<Object> newHistory = new LinkedList<>();
    newHistory.addAll(history);
    newHistory.addAll(r.history);
    return new Undoable<R>(r.value, newHistory);
  }

  public <R> Undoable<R> undo() {
    Deque<Object> newHistory = new LinkedList<>(this.history);
    R r;
    try {
      r = (R)newHistory.removeLast(); //line A
    } catch (NoSuchElementException e) {
      throw new CannotUndoException();
    }
    return new Undoable<R>(r, newHistory);
  }
}
Undoable i=Undoable.of(“hello”).flatMap(s->{
德克历史;
历史记录=新的LinkedList();
历史。添加(s);
返回新的可撤消(s.length(),history);
});
可撤销的d=i.撤销();
我得到
Undoable
Undoable
擦除到
Undoable
。但是
R
undo()
方法中变成了什么?它是否推断为
Double
,因为
Double
是该方法调用的目标类型


我试着在我的机器上运行代码,它运行得很好,但我不知道为什么。有人能解释一下吗?非常感谢

R类型它将成为
对象
,即使在方法调用期间进行推断,这是因为
R
没有任何用处,因为您从未显式声明过它,就像这样
i.undo()
,在大多数使用情况下,参数类型在方法中用于推断方法参数的类型。关于您的代码流,即使使用Undone,
d.value
也是一个字符串,这是因为
d
Undone
类型将被编译为对象,因为
R
类型可以是任何类型,在编译时不知道如何将方法调用的类型推断结果与您的声明进行比较。如果你把
Undone d=i.undo()
放进去,它会抛出一个错误,否则如果你不显式声明,永远不会抛出强制转换异常。

因为我能理解,是的,它会从整数转换为双精度,试着用不同的东西声明d变量,看看它会抛出一个错误。对,另一个问题是这个问题的一个更一般的变体。我对类型推断和类型擦除是如何工作的感到困惑。起初,我认为既然R被推断为Double,为什么它不会抛出ClassCastException呢。我怀疑R最终会被擦除为Object,但这并没有真正意义,因为如果R已经被推断为Double,为什么R会被擦除为Object呢。现在你和Wasserman已经把事情弄清楚了,我意识到R仍然被擦除为Object,并且在检查它是否是类型安全的之后推理丢失了。很高兴这有帮助,但请用抛出强制类型异常的东西来测试它,我现在很好奇,尝试将Double更改为一些荒谬的东西,比如InputStream或诸如此类的东西。只有将其值取出并对其进行操作,我才会得到ClassCastException。很抱歉,我还是Java新手,所以我不知道InputStream类型是如何工作的。但要将它放到上下文中,如果我执行类似于
System.out.println(d.value/2)的操作,我将得到一个ClassCastException。只有当我们对它进行操作时,Java才意识到它不匹配。我希望我能证明你在找什么哈哈哈。
Undoable<Integer> i = Undoable.of("hello").flatMap(s -> {
    Deque<Object> history;
    history = new LinkedList<>();
    history.add(s);
    return new Undoable<Integer>(s.length(), history);
});
Undoable<Double> d = i.undo();