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

按参数分类?

  •  2
  • rigon  · 技术社区  · 14 年前

    我想知道是否可以通过Java中的参数传递类型。

    我来解释一下:

    假设下一个代码

    class Bee {
        // Class implementation
    }
    
    class Worker extends Bee {
        // Class implementation
    }
    
    
    class Queen extends Bee {
        // Class implementation
    }
    

    现在用我的蜜蜂物品创造一个容器

    Vector<Bee> x=new Vector<Bee>();
    // ...
    for(i=0;i<10;i++)
        x.add(new Worker());
    // ...
    for(i=0;i<10;i++)
        x.add(new Queen());
    

    现在我要创建一个通用方法,它迭代向量并返回一个具有特定类型的蜜蜂、工蜂或蜂王的集合。如何做到这一点?

    编辑

    我试过

    search(x,Worker.class);
    
    static public <T extends Bee> Set<T> search(List<Bee> bees, Class<T> clazz){
        // ...
    }
    

    我得到一个错误报告“方法搜索(list,class)不适用于参数(set,class)”。第二个参数出现问题,因为类型不兼容。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Andreas Dolk    14 年前

    从您的编辑我看到,您仍然在努力实现。下面是一个工作示例:

    public static void main(String[] args) {
        Collection<Bee> bees = new ArrayList<Bee>();
        bees.add(new Hive.Worker());
        bees.add(new Hive.Queen());
        Set<Queen> queens = getBeesOfOneType(bees, Queen.class);
    }
    
    private static <T extends Bee> Set<T> getBeesOfOneType(Collection<Bee> bees, Class<T> beeType) {
        Set<T> result = new HashSet<T>();
        for (Bee bee : bees) {
            if (beeType.isInstance(bee)) {
                // The following cast is safe. The previous if makes sure that
                // that bee can be cast to T at this place
                T beeTypeInstance = beeType.cast(bee);
                result.add(beeTypeInstance);
            }
        }
        return result;
    }
    

    还有一种类型的安全警告,我很肯定这一个不能消除。编译器现在没有,我们只选择T型蜜蜂,所以它必须警告我们。

        2
  •  5
  •   polygenelubricants    14 年前

    你可以使用 instanceof 要测试的表达式 Bee 是一个 Worker 或A Queen . 你可以用这个过滤你的 Vector<Bee> (或者更好的是, List<Bee> )根据子类型。

    番石榴还提供 Iterables.filter(Iterable<?> unfiltered, Class<T> type) 你可以用的。

        3
  •  4
  •   matt b    14 年前

    使用 Class 作为方法的参数

    public <T extends Bee> Set<T> filterBeesByType(List<Bee> bees, Class<T> clazz)
    

    顺便说一下,通过集合类型的接口引用它们是一个很好的实践( Set , List 等)而不是实施( Vector )

        4
  •  3
  •   Andreas Dolk    14 年前

    使用 instanceof 操作员:

    public static Set<Queen> queensOnly(Collection<Bee> bees) {
      Set<Queen> queens = new HashSet<Queen>();
      for (Bee bee:bees) {
        if (bee instanceof Queen) {
          queens.add((Queen) bee);
        }
      }
      return queens;
    }