3

如果我在包 abc 中有一个类名 ClassX,并且我想导入类 abxClassX

Java中是否有一些限制阻止我这样做?就用法而言,我总是可以使用导入类的完全限定名称,对吧?

Eclipse 似乎无法解决此导入问题,我需要知道 Java 本身是否存在导致问题的限制。

以下代码是否合法:

a\b\c\ClassX.java :

package a.b.c;
public class ClassX {
//
}

a\b\x\ClassX.java :

package a.b.x;

import a.b.c.ClassX;

public class ClassX {
    public static void main(String[] args) {
        a.b.c.ClassX newObj = new a.b.c.ClassX();
    }
}

如果不是,那为什么?

4

2 回答 2

4

更准确地说

  • 并不是说我们不允许导入与导入它的类具有相同简单名称的类,
  • 但是我们不允许将导入类命名为与任何已经导入的类相同

尝试这样做将导致错误消息:[NameOfImportingClass] is already defined in this compilation unit

此限制的目的是防止名称歧义/冲突。

例如,没有进口以下都是合法的:

package a;
class B{}

package b;
class B{
   a.B objectPackageaB; //legal - full-package-name so no ambiguity
   b.B objectPackagebB; //legal - full-package-name so no ambiguity
   B objectB; //legal, as now it can only represent B from package "b" -> b.B 
}

现在让我们添加import a.B

package b;    
import a.B; // <---

class B {
     b.B objectbB;  //still legal, full-package-name so no ambiguity
     a.B objectaB;  //still legal, full-package-name so no ambiguity
     B objectB;   //ambiguous, so ILLEGAL. Which type B should represent? a.B OR b.B?
}

如果 Java 不能阻止这种情况,它需要决定B objectB应该代表什么类型。

我们有两个选择:

  1. 它将代表正在导入b.B的 so 类型。但这意味着使用from package 我们仍然需要将其写为,这意味着冗余/死代码只会让程序员感到困惑。Baa.Bimport a.B;
  2. 它将代表导入a.B的 so 类型。但那会感觉不自然,因为里面会代表其他类型!.class B{ }B

以上解决方案都不好。

如果问题没有好的解决方案,最好的选择是防止出现。

于 2011-06-13T08:40:08.937 回答
1

我认为不是,而是a.b.c.Classx newObj = a.b.c.ClassX()a.b.c.ClassX newObj = a.b.c.ClassX()(Class_X_, no Class_x_) 它应该可以工作:-)

于 2011-06-13T09:44:40.033 回答