eclipse 3.4(ganymede)包与类型碰撞

时间:2010-04-20 10:38:52

标签: java types package collision eclipse-3.4

我们有一个以例外情况结束的包裹,例如:

package a.b.c.exception;

我们的代码库在eclipse 3.3之前没有任何问题,但是当我们转移到eclipse 3.4时,它开始给出与此包相关的错误:

"The package a.b.c.exception collides with a type"

当我将包名重构为a.b.c.exceptions时,没有问题。这是由于eclipse 3.4中的错误还是有一些设置来纠正这种行为?

6 个答案:

答案 0 :(得分:7)

这是因为exception包中有一个名为a.b.c(小写“e”)的类和一个名为a.b.c.exception的包。

它会导致名称冲突,因为如果您有代码a.b.c.exception.doSomething(); - 这是否意味着您要在doSomething()类中调用静态a.b.c.exception方法?或者它是否意味着有一个名为a.b.c.exception.doSomething的类,你试图调用它的构造函数?

坚持使用Java命名约定 - 将所有小写包装起来,以大写字母开头并以驼峰形式开头 - 你永远不会看到这个问题。

========== EDIT ==========

这是此错误应显示的唯一合法原因...

它不必直接在您的项目中,它可能在您的项目所依赖的另一个项目或库中。这应该显示构建路径或项目中任何位置出现的类:在Eclipse工具栏中点击Flashlight查找按钮 - >选择“Java搜索” - >在搜索字段中输入a.b.c.exception - >选择'区分大小写' - >在“搜索”中选择“类型” - >确保为“搜索范围”选择了所有选项。

您使用的是生成类的任何工具吗?他们可以将它们放入项目的构建目录中吗?当您看到错误时,如果您转到项目的构建目录,然后进入a / b / c /目录,您会看到“异常”的.class文件吗?

当然Eclipse总体上可能有一个错误(虽然我希望Eclipse 3.4中会有一个bug报告,如果它是......你就能找到更多的抱怨),你的Eclipse安装可能是以某种方式打破(其他人可以在Eclipse 3.4中打开你的项目吗?你能在另一个目录中安装一个干净的Eclipse 3.4吗?错误是否出现在那里?),或者你的项目可能会以某种方式混乱(创建一个新项目除了JDK之外没有依赖项,在新项目中创建abcexception包,在项目中创建一个类import a.b.c.exception.*;并查看是否发生错误。)。

答案 1 :(得分:4)

在Java中,您不能拥有与包名相同的类名。

这意味着JDT包必须仅在3.4

中强制执行该规则

例如,请参阅bug 63668


正如Nate评论:

  

名为Exception的类不会阻止您创建包例外   案件重要

     

还要记住,课程的全名包括其所在的课程。
  因此a.b.SomeClass(类名称)与x.y.SomeClass(包名称)不同   这里没有名字冲突。

     

类名和包名必须在case和package中匹配才会导致此错误。

请参阅his more accurate answer

答案 2 :(得分:1)

我在我继承的庞大代码库中遇到了类似的问题。事实证明,冲突是由JavaDoc链接中的部分限定类名引起的。

为了解释,Eclipse告诉我,我有a.b.c.d的包/类型冲突。在编译a.b.c.d.London时。对a.b.c.d的代码执行java搜索后发现Eclipse认为a.b.c.Paris中的JavaDoc注释是匹配的。 JavaDoc评论包含{@ link d.NewYork}。当我将其更改为{@link a.b.c.d.NewYork}时,编译错误已解决。

还应该注意的是,NewYork没有导入到Paris类中,因为它只出现在JavaDoc注释中。这也使得它的缩写形式无法解决,点击评论中的链接不起作用。使其成为绝对引用也使JavaDoc链接起作用。

答案 3 :(得分:1)

我知道这听起来很傻,而且可能太简单了,但我通过以下方式解决了这个完全相同的错误信息:

  • 删除导致错误消息的包名称的整行。
  • 保存.java文件(这会在同一行上触发一个新错误,说明“声明的包”“与预期的包”不匹配“),它应该这样做。
  • 将原始包名重新键入同一行。
  • 保存.java文件。

无法告诉你为什么会这样,但确实如此,Eclipse当场就停止发脾气。

安全打字和快速编码。

-Goodge

答案 4 :(得分:0)

我改变了eclipse中的一个编译选项,问题就消失了。 在工作区属性下: Java编译器 - >错误/警告 - >     将“未使用的导入”从“警告”更改为“忽略”。

答案 5 :(得分:0)

如果您有一个Foo类,则不能使用以Foo结尾的包,例如com.my.Foo。
此外,如果您使用maven样式,则您的项目中的资源类似于src / main / resources
资源中的文件夹也有一个包样式,而且,您也不能拥有包含类名称的文件夹。

根据建议的惯例开发Jenkins插件时,您肯定会遇到此问题 如果您遵循Jenkins约定,并且在包x.y中的名为MyBuilder的类中创建构建器,那么您还应该将.jelly放在名为x.y.MyBuilder的资源文件夹中。这将导致上述问题 但是,如果您将资源文件夹命名为x.y.myBuilder(注意小写' m'在myBuilder中),与推荐的约定不同,该插件仍将按预期工作