【问题标题】:Passing a class as a parameter in a method and using this parameter in an If statement在方法中将类作为参数传递并在 If 语句中使用此参数
【发布时间】:2015-09-03 07:43:24
【问题描述】:

我想要这样的东西:

public static List<Type> getProtocolls(Class clazz, Transaction trx) {
    Iterator<Type> iterator = trx.getContext().getProtocolls()
    List<Type> list = null;
    while (iterator.hasNext()) {
        if (iterator.next() instanceof clazz) {
            list.add(iterator.next())
        }       
    }
    return list;
}

我主要谈论这部分:(iterator.next() instanceof clazz) - 这甚至可以像这样将 Class 作为参数传递吗? Eclipse 说“clazz 无法解析为类型”。

【问题讨论】:

  • 试试if (iterator.next() instanceof clazz,class) {
  • @SaviNuclear - 根本不工作:(
  • 旁注:您应该在使用列表之前对其进行实例化。但这不是解决您的 instanceof-problem 的方法。
  • instanceof Class 而不是 clazz
  • if (iterator.next() instanceof Class ) {

标签: java class runtime-type


【解决方案1】:

您可以使用isAssignableFrom 方法。另外,请注意您在循环中有两次对 next() 的调用,因此您将跳过一半的元素 - 您应该将此调用的结果提取到一个局部变量:

while (iterator.hasNext()) {
    Type t = iterator.next();
    if (clazz.isAssignableFrom(t.getClass())) {
        list.add(t)
    }       
}

编辑:
正如@Fildor 在 cmets 中指出的那样,您还忘记了初始化 list。而不是初始化为您当前拥有的null 列表,您应该拥有List&lt;Type&gt; list = new LinkedList&lt;&gt;(); 的内容。

【讨论】:

  • 而他的listnull
  • 你也可以使用if (clazz.isInstance(t))
【解决方案2】:

你提到了参考,但你必须在那里使用类:-

public static List<Type> getProtocolls(Class clazz, Transaction trx) {
    Iterator<Type> iterator = trx.getContext().getProtocolls()
    List<Type> list = null;
    while (iterator.hasNext()) {
        if (iterator.next() instanceof Class ) {
            list.add(iterator.next())
        }       
    }
    return list;
}

【讨论】:

  • 他不知道前面的课程。这就是为什么这里必须使用clazz.isAssignableFrom()的动态实例。
猜你喜欢
  • 1970-01-01
  • 2016-03-02
  • 2019-11-01
  • 2012-02-07
  • 2017-01-15
  • 1970-01-01
  • 2014-02-25
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多