我正在使用一个Java库,其目录结构如下所示:
/com
/example
/LibX
Server.java
Client.java
现在,从使用上述类的项目来看,在我看来,导入com.example.LibX.*
和使用Client client = new Client(...);
有点含糊不清,因为“客户端”可能意味着什么。因此,我尝试了以下方法,只收到“未找到包”错误:
import com.example.*;
LibX.Client client = new LibX.Client(...);
有可能做我描述的吗?或者是否有其他方法可以在不使用com.example.LibX.Client
的情况下消除歧义?
答案 0 :(得分:3)
Java包不是分层的,即使它们有时看起来像它。正如您所建议的那样,您无法导入包的“树”。您需要使用通配符导入特定包,或者导入特定的类名,或者直接在代码中使用完全限定的类名。
以下内容并不含糊,被认为是最佳做法:
import com.example.LibX.Client;
...
Client client = new Client(...);
在IDE可以为您组织导入的世界中,没有理由不明确说明它们。
答案 1 :(得分:2)
你对歧义的关注是不必要的 - 如果你有一个模糊的引用,你的课程将无法编译 - 例如
import java.util.Date;
import java.sql.Date;
public class Test {
private Date date;
}
不会编译。因此,如果您可以编译该类,那么根据定义,您没有不明确的引用。
顺便说一句,LibX.Client有点令人困惑。通常类名是大写的,包名称是小写的,所以如果你这样做(如果LibX是顶级包并且你给出了全名)它看起来更像是内部类引用,就像上面的Andy的回应一样。
答案 2 :(得分:1)
如果您愿意将Client和Server分组为静态嵌套类,则可能会这样做。
public class LibX {
public static class Client {
//...
}
public static class Server {
//...
}
}
现在您可以import mypak.LibX
然后执行new LibX.Client()
。这有一个令人遗憾的缺点,就是强迫你将类分组并创建额外的空LibX类。
答案 3 :(得分:0)
没有像你描述的那样的机制。您唯一的另一种可能性是使用单一类导入:
import com.example.LibX.Client;