ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 类型不匹配:无法将MyClass转换为MyClass

2019-09-01 02:10:07  阅读:223  来源: 互联网

标签:java inner-classes generics


关于泛型和/或内部类,我缺少一些东西.我想用专门的迭代器编写一个专门的树类.类FooTree如何有一个迭代器返回FooTree类型的连续节点而不是类型V的节点值?课程开始:

public class FooTree<V>
   private final V value;
   private FooTree<V> left;
   private FooTree<V> right;

我让Iterator类成为一个内部类,因为没有其他人会关心它.在FooTree中定义的获取迭代器的工厂方法是:

public Iterator<FooTree<V>> preorderIterator() {
    return this.new PreorderIterator<FooTree<V>>;
}

由于next()必须返回一个V,如接口中声明的那样,我添加了nextNode()来绕过返回类型.内部类开始:

private class PreorderIterator<V> implements Iterator<V> {
   private FooTree<V> current;  
   . . .
   public FooTree<V> nextNode() {
      current = FooTree.this;                        **

我得到了这个奇妙的编译错误:
类型不匹配:无法转换… FooTree< V>到… FooTree< V> (两者都是相同的包装)
哇哇!?
  我可以通过添加一个强制转换来编译:current =(FooTree)FooTree.this;
但是我为什么要首先要这样做?
它试图变得“聪明”并且认为第一个V可能与第二个V不同吗?

这样做的正确方法是什么?

解决方法:

尝试做出声明:

private class PreorderIterator implements Iterator<V>

< V>在你的内部阶级是不必要的,在这种情况下,无益.

实际发生的是< V>在PreorderIterator< V>中正在“遮蔽”< V>来自你的外部类,所以虽然它们看起来像是相同的类型参数,但实际上它们实际上是具有相同名称的不同参数.

标签:java,inner-classes,generics
来源: https://codeday.me/bug/20190901/1780182.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有