【问题标题】:Generic method with type argument not found by Java compilerJava 编译器找不到具有类型参数的泛型方法
【发布时间】:2011-12-18 17:37:44
【问题描述】:

我花了一天的大部分时间试图理解为什么 Java 不能编译带有泛型类型参数的简单泛型方法,但只有在导入封闭类时才可以。基本上,我将 Spring 上下文操作公开为一个名为 SpringApplicationContext 的类中的静态方法:

public static <T> List<T> listBeansOfType(Class<T> type)
{
  return new ArrayList<T>(context.getBeansOfType(type).values());
}

当我从同一个包中的单元测试中调用它时,它可以工作。这是测试调用:

 List<DomainRepo> repos =
   SpringApplicationContext.listBeansOfType(DomainRepo.class);

但是,当我从另一个包中的代码调用它时,完全相同的代码会失败。编译器说它找不到符号 listBeansOfType(java.lang.Class)。我已经导入了类,但是我还没有对方法进行静态导入。

更奇怪的是,当我在一周前编写这段代码时,它仍然有效。从那时起,我不得不在完成发布过程时将所有这些都放在一边。当我使用 java 1.6 使用 maven 或 Eclipse 进行编译时,也会发生同样的错误。任何提示都将受到欢迎。

【问题讨论】:

  • 这门课是公开的吗?

标签: java generics


【解决方案1】:

确保您拥有所有需要的 Maven 依赖项。如果您的 Junit Test 有效,但 mvn compile 失败,则可以将依赖项包含在范围测试中。

    <dependency>
       <groupId>group-a</groupId>
       <artifactId>artifact-b</artifactId>
       <version>1.0</version>
       <scope>TEST</scope> <!-- would explain why you can run your code as junit -->
    </dependency>

检查“上下文”的类型以及方法 getBeansOfType() 的定义位置。它们可能作为 mvn 依赖项丢失。

【讨论】:

  • 谢谢一百万 - 这确实是一个不正确的依赖关系,但没有这么简单的事情。您的评论促使我深入研究依赖关系树,其中有一个尚未从发布版本更新到主开发版本。
  • 嗯 - 实际上,我说得太早了。有一个过时的依赖项会引入旧版本的 SpringApplicationContext,而没有相关方法。然而,修复这种依赖并没有改变症状。
  • 我认为我已经成为 Eclipse 中某种不良缓存行为的受害者 - 在从 ~/.m2/repository 删除包含 listBeansOfType() 方法的模块之后(我之前已经安装并删除了它),并在 Eclipse 中多次重建和更新 Maven 依赖项,最终决定玩得好。没有其他变化...
  • 这听起来像是一个依赖问题。如果您有可能更新到 Eclipse Indigo RC1 和最新的 Maven 插件,您应该考虑一下。修复了一些令人讨厌的错误,Eclipse 还将提供“强制更新”,这将清除您的存储库并重新获取模块!对我来说,升级解决了 WTP 和 Maven 之间的一些主要问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多