【问题标题】:java generics return type of method should be same pass parameter passedjava泛型方法的返回类型应该与传递的传递参数相同
【发布时间】:2013-09-24 01:08:57
【问题描述】:

我想从列表中返回类的对象(作为参数传递给方法)。同样,在返回时,我需要将对象转换为作为参数传递的类。我的问题是我尝试按照下面给出的方式进行操作,但它不正确,因为它给了我编译器错误“classToFind 无法解析为类型”

private <T extends myClass> T findObject(List<JAXBElement<? extends myClass>> list, 
          Class<? extends myClass> classToFind) {
    for (JAXBElement<? extends myClass> current : list) {
        if(current.getClass() == classToFind) {
               return (classToFind) currentClass; // error "classToFind cannot be resolved to a type"
        }
    }
    return null;
}

【问题讨论】:

  • 我想返回匹配给定类的“当前”对象
  • 此外,“classToFind”是对 Class 对象的引用,但它本身不是类型 - 因此您不能在通常的强制转换语法中使用它。您需要执行类似 classToFind.cast(currentClass) 的操作。见this answer
  • 我刚刚注意到:current 将始终是 JAXBElement 类型。如果您想在运行时检查类型参数,您可能必须使用反射。如果有可能的话。必须通过这个。

标签: java


【解决方案1】:

return classToFind.cast(current)。与其他解决方案不同,这是类型安全的,不需要SuppressWarnings。但是,显然,无论如何,第二个参数都必须改为Class&lt;T&gt; classToFind

【讨论】:

  • 错误:类型不匹配:无法从 capture#16-of 转换?将 myClass 扩展到 T
  • 您可能忽略了第二句话,因为我稍后添加了它。当然参数必须使用与返回类型相同的类型变量来参数化以定义关系。
  • 但它不能确保 classToFind 是从 myClass 派生的
  • 确实&lt;T extends myClass&gt; 已经声明了这一点。所以Class&lt;T&gt; 必须代表 myClass 或其子类。
【解决方案2】:

如果不认可你正在做的事情,这将起作用:

private JAXBElement<? extends myClass> findObject(List<JAXBElement<? extends myClass>> list, Class classToFind) {
for (JAXBElement<? extends myClass> current : list) {
        if (current.getClass() == classToFind) {
            return current;
        }
    }
    return null;
}
// This returns the actual value encapsulated inthe JAXBElement
private myClass findObject2(List<JAXBElement<? extends myClass>> list, Class classToFind) {
    for (JAXBElement<? extends myClass> current : list) {
        if (current.getClass() == classToFind) {
            return current.getValue();
        }
    }
    return null;
}

【讨论】:

  • 您的代码无法编译:在方法签名中将class更改为Class
  • 但它不能确保 classToFind 是从 myClass 派生的
  • 修复了班级问题。引入了第二种方法 findObject2,它返回 JAXBElement 中嵌入的实际元素。另外,Shivam,我同意第一种方法的签名并不能保证它,但代码会在测试中证明它。第二种方法解决了您的问题。
猜你喜欢
  • 2013-07-17
  • 2011-02-20
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
相关资源
最近更新 更多