【问题标题】:Access generic outer class field from inner class without casting从内部类访问通用外部类字段而不进行强制转换
【发布时间】:2014-08-08 09:36:37
【问题描述】:

这是代码:

public class OuterClass<T> {
    private T outerField;

    public class InnerClass<T> {
        private T innerField;
        public void setField() {
            innerField = (T) outerField;
        }
    }
}

有没有办法编写“innerField = outerField”来避免强制转换为 T?

我觉得这不是访问通用外部类字段的正确方法,因为内部类应该知道外部字段的类型。

编辑: 我尝试了您的建议,它在我发布的代码示例中有效。 但我真正的代码是这样的:

public class OuterClass<T extends Comparable<T>> implements Iterable<T>  {
    private T outerField;

    @Override
    public Iterator<T> iterator() {
        return null;
    }

    public class InnerClass<T extends Comparable<T>> implements Iterator<T> {
        @Override
        public boolean hasNext() {
            return false;
        }
        @Override
        public T next() {
            T innerField = (T) outerField;
            return null;
        }
        @Override
        public void remove() {

        }
    }

}

再一次,我怎样才能写出'innerField = outerField'来避免转换成T? 抱歉,对于双重问题,但我尝试编写尽可能小的代码 sn-p(它不构成我真正的问题)。

关键是这里我不能从内部类中移除类型参数T,因为我必须声明它必须实现Iterator。

【问题讨论】:

  • 在我看来,T 代表 InnerClass 可能隐藏了 TOuterClass。从InnerClass 中删除类型参数,看看会发生什么。
  • 谢谢,但我真正的问题要复杂一些。我编辑了我的问题。
  • 如果你对你的实际代码尝试同样的事情会发生什么?说真的,试试看。将&lt;T&gt; 保留在implements Iterator&lt;T&gt; 上,但删除InnerClass 上的部分。
  • 我现在实际上解决了我的问题。我应该只在内部类中编写“实现 Iterator”而不重新创建新参数 T(这会影响外部参数)。

标签: java generics casting inner-classes


【解决方案1】:

按照@user3580294 的建议,从 InnerClas 中删除类型参数。所以下面的编译没有任何错误。

public class OuterClass<T> {
    private T outerField;

    public class InnerClass {
        private T innerField;
        public void setField() {
            innerField =  outerField;
        }
    }
}

【讨论】:

    【解决方案2】:

    InnerClass#innerField 不必与OuterClass#outerField 属于同一类型,因为内部T 参数隐藏了外部参数。

    【讨论】:

      猜你喜欢
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 2021-04-21
      • 2014-02-11
      相关资源
      最近更新 更多