Java 按参数输入?

Java 按参数输入?,java,types,arguments,Java,Types,Arguments,我想知道在Java中是否可以通过参数传递类型 让我解释清楚: 假设下一个代码 class Bee { // Class implementation } class Worker extends Bee { // Class implementation } class Queen extends Bee { // Class implementation } 现在用my bees对象创建一个容器 Vector<Bee> x=new Vector<

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

让我解释清楚:

假设下一个代码

class Bee {
    // Class implementation
}

class Worker extends Bee {
    // Class implementation
}


class Queen extends Bee {
    // Class implementation
}
现在用my bees对象创建一个容器

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());
Vector x=new Vector();
// ...

对于(i=0;i您可以使用
instanceof
表达式来测试
Bee
是否是
工作者
女王
。您可以使用它根据子类型过滤
向量
(或者更好的是,
列表


Guava还提供了您可以使用的功能。

使用
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;
}
publicstaticset queensOnly(收集蜜蜂){
Set queens=new HashSet();
用于(蜜蜂:蜜蜂){
如果(蜂王的蜜蜂实例){
添加((女王)蜜蜂);
}
}
返回皇后区;
}

使用
作为方法的参数

public <T extends Bee> Set<T> filterBeesByType(List<Bee> bees, Class<T> clazz)
public Set filterBeesByType(列表蜜蜂,类分类)

顺便说一句,通过接口(
Set
List
等)而不是实现(
Vector
)引用集合类型是一种很好的做法。

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

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;
}
publicstaticvoidmain(字符串[]args){
Collection=newarraylist();
bees.add(new Hive.Worker());
bees.add(new Hive.Queen());
Set queens=getBeesOfOneType(bees,Queen.class);
}
私有静态集getBeesOfOneType(收集蜜蜂,类BeetType){
Set result=new HashSet();
用于(蜜蜂:蜜蜂){
if(beeType.isInstance(bee)){
//下面的强制转换是安全的。上一个if确保
//那只蜜蜂可以在这个地方被投到T
T beeType实例=beeType.cast(bee);
result.add(beetype实例);
}
}
返回结果;
}


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

将列表过滤到列表中,而不是集合中更合适。此外,公共应该在泛型声明之前。否则,这是正确的answer、 @这么多问题:filterBeesByType(listOfBees,Worker.class)@unbeli,谢谢,错过了
public
错误。至于
Set
vs
List
的正确性问题,我认为这完全取决于意图,如果这段代码的目标是简单地将
List
过滤到与
clazz
匹配的类型,或者删除重复的类型。原始的stion提到返回一个集合。这两种情况都是有效的。过滤逻辑是
if(clazz.isInstance(bee))…
,假设你也希望子类型匹配。为什么会被否决?我现在太累了,不能写一篇文章,但我的答案肯定没有用?你可以从我那里得到补偿的上升票。你的答案很有用。@Andreas:还有我的上升票,因为你的答案实际上有一个例子。也许我不应该在累的时候堆积溢出。@ANDREA:我想我明白为什么我们的答案被否决了:它们本身并不是真正的通用方法。使用
instanceof
你必须硬编码类型。不过,我仍然坚持我的番石榴建议。如此之多,以至于我将尝试提供一个示例片段。也许明天吧。番石榴建议+1;我认为instanceof不能满足要求正如你所说的一般性要求。下一票?对于满足要求的解决方案?来吧,下一票,告诉我有什么错!OP希望将类型作为参数传递(请参见问题标题和问题的第一行),因此这不满足要求。很抱歉,另一个答案是正确的,您的答案不是。@unbeli-Ah,所以当这是一个stict要求时,它就不能满足,因为,不,我们不能将类型作为参数传递:
对象不是“类型”。类型只是一个概念。概念不能传递给方法,只能传递给原语和对象引用。但无论如何,“另一个”的答案更接近OP的想法。当你说“传递一个整数”时,每个人都理解,你传递的是一个表示整数的对象,而不是整数的概念。当你说“传递一个t”时ype’,它意味着传递一个对象,表示一个类型,这在Java中是一个类。这正是我想要的。谢谢你。你应该抑制这个警告,因为你可以证明它是安全的。将该强制转换移到局部变量声明的右侧将使@SuppressWarnings的作用域最小化。@ILMTitan-感谢您的评论,以前从未以这种方式使用过注释,这将不是最后一次!今天学到了一些新东西:)为什么不使用
beeType.cast(bee)
并完全避免未经检查的强制转换?在我看到这一点之前,我不能投票。@Andreas:不管它怎么做,重要的是它说什么做什么。你永远不会得到ClassCastException,因为你已经执行了
beeType.isInstance
…我不是说先不要使用isInstance!您可能更喜欢注释和注释自己的源代码,但不幸的是,您错了。使用库函数,尤其是当它们是为了避免您在这里所做的事情而创建的时候。
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;
}