代码之家  ›  专栏  ›  技术社区  ›  sooniln

复杂泛型组合

  •  0
  • sooniln  · 技术社区  · 16 年前

    class MySet<T> {
    
      MySet<? extends T> child; 
    
      void doStuff (Collection<? extends T> args) {
        child.doStuff(this, args);
      }
    
    }
    

    编辑:修复问题和示例代码,以反映真实问题

    现在,孩子 <T <T >,因此父级必须传入一个集合 <X &燃气轮机;哪里 <X <T >。请记住,此父级->子链可以延伸到任意长度。有没有办法安排泛型,以便parent.doStuff(…)可以编译,也就是说,只能使用其限制最严格的子级的参数来调用它?

    是确保孩子不能比他们的父母使用泛型(即MySet)更严格的唯一解决方案 < <? extends T >)孩子们是否比其他地方的父母更严格?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Varkhan    16 年前

    我可以马上对问题的一部分给出否定的回答:

    泛型使parent.doStuff(…) 将编译,即,使其只能 用它的参数调用 限制性最强的孩子?

    这意味着java编译器 会把一般信息全部传给你 向上到达父级的方式->子链到 确定允许的参数是什么 多斯塔夫可能是,我不知道 如果它有这种能力。

    更进一步说,如果您有一个检查过的类型而不是普通泛型,并且有一个方法可以在链中传递接受的(最严格的)实际类型,那么您可以在运行时进行检查,并引发运行时错误,但它决不会是编译错误。

    所以不,除非实际的最终类型是已知的(并且可能由第二个类型arg指定),否则编译器将无法在这方面帮助您。

        2
  •  0
  •   Tom Hawtin - tackline    16 年前

    所呈现的代码似乎没有任何意义。

    考虑

     MySet<String> c = ...;
     MySet<Object> p = new MySet<Object>(c);
     Collections<Integer> ints = ...;
     p.doStuff(ints);
    

    c.doStuff(???, ints) . ints Collection<Integer> ,但被调用方需要 doStuff(Collection<? extends String>) .