4

我们有一个以异常结尾的包,例如

package a.b.c.exception;

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

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

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

4

6 回答 6

7

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

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

坚持 Java 命名约定 - 将所有小写字母封装,以大写字母开头的类和驼峰字母大写字母 - 你将永远不会看到这个问题。

==========编辑==========

这是出现此错误的唯一正当原因...

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

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

当然 Eclipse 通常可能有一个错误(尽管我希望 Eclipse 3.4 中会有一个错误报告,如果是这样的话,您将能够找到更多的投诉......),您的 Eclipse 安装可能会在某些情况下被破坏方式(其他人可以在 Eclipse 3.4 中打开您的项目吗?您可以在另一个目录中进行干净的 Eclipse 3.4 安装吗?错误是否出现在那里?),或者您的项目可能以某种方式搞砸了(创建一个没有依赖项的新项目除了JDK之外,在你的新项目中创建abcexception包,在你的项目中创建一个类,import a.b.c.exception.*;看看是否出现错误。)。

于 2010-04-20T13:00:03.040 回答
4

在 Java 中,类名不能与包名相同。

这意味着 JDT 包必须仅在 3.4 中强制执行该规则

例如,参见错误 63668


正如 Nate 所说:

名为 Exception 的类不会阻止您创建包异常
案件事宜

还要记住一个类的全名包括它所在的包。
所以a.b.SomeClass(类名)与x.y.SomeClass(包名)不同。
这里不会有名称冲突。

类名和包名必须在大小写和包中都匹配才能导致此错误。

他更准确的回答

于 2010-04-20T10:49:21.057 回答
1

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

换句话说,Eclipse 告诉我在编译 abcdLondon 时我遇到了 abcd 的包/类型冲突。对 abcd 的代码进行 java 搜索显示 Eclipse 认为 abcParis 中的 JavaDoc 注释是匹配的。JavaDoc 注释包含 {@link d.NewYork}。当我将其更改为 {@link abcdNewYork} 时,编译错误已解决。

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

于 2010-08-05T05:55:58.043 回答
1

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

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

无法告诉你为什么这会奏效,但它确实奏效了,并且 Eclipse 不再当场发脾气。

安全打字和快速编码。

-古奇

于 2012-11-17T21:47:52.647 回答
0

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

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

于 2014-03-26T07:00:27.947 回答
0

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

于 2010-04-29T16:14:16.353 回答