导入两个同名的类。 如何处理?
说我有一个代码,如:
import java.util.Date; import my.own.Date; class Test{ public static void main(String [] args){ // I want to choose my.own.Date here. How? .. // I want to choose util.Date here. How ? } }
我应该是完全合格的类名吗? 我可以摆脱import陈述吗? 在现实世界的编程中这样的场景是常见的吗?
您可以省略导入语句并使用整个path引用它们。 例如:
java.util.Date javaDate = new java.util.Date() my.own.Date myDate = new my.own.Date();
但是我会说,使用两个具有相同名称和相似function的类通常不是最好的主意,除非你能清楚地知道哪个是哪个类。
使用完全限定名称而不是导入类。
例如
//import java.util.Date; //delete this //import my.own.Date; class Test{ public static void main(String [] args){ // I want to choose my.own.Date here. How? my.own.Date myDate = new my.own.Date(); // I want to choose util.Date here. How ? java.util.Date javaDate = new java.util.Date(); } }
是的,当您使用相同的简单名称导入类时,必须使用它们的全限定类名引用它们。 我会留下导入语句,因为它使其他开发人员能够了解文件中的内容。
java.util.Data date1 = new java.util.Date(); my.own.Date date2 = new my.own.Date();
另一种做法是子类:
package my.own; public class FQNDate extends Date { }
然后在包含java.util.Date的包中导入my.own.FQNDate。
这种情况在现实世界的编程中并不常见,但也不是很奇怪。 它有时会发生在不同的包中的两个类有相同的名称,我们需要他们两个。
如果两个类具有相同的名称,则不是强制性的,那么它们将包含相同的function,我们只应该select其中的一个。
如果我们两个都需要,那么使用它就没有什么坏处。 这也不是一个糟糕的编程思想。
但是我们应该使用完全限定的类名(同名)来明确我们所指的类。
🙂
如果你有自己的date类,你应该区分它构成Date类的内置。 即你为什么创造自己的。 像ImmutableDate或BetterDate或NanoDate,甚至MyDate会指出为什么你有自己的date类。 在这种情况下,他们将有一个独特的名字。
例如,当我们将一个类映射到另一个类时(例如,当切换到一组新的类来表示人员数据时),我遇到了这个问题。 在这一点上,你需要两个类,因为这是代码的整个点 – 将一个映射到另一个。 而且你不能在任何地方重新命名课程(再次,工作是映射,而不是去改变别人做的)。
完全合格是一种方法。 看来你实际上不能包含两个import语句,因为Java会担心例如哪个“Person”。
您可以使用导入导入其中的一个。 对于所有其他类似的类,您需要指定完全限定的类名称。 否则,你会得到编译错误。
例如:
import java.util.Date; class Test{ public static void main(String [] args){ // your own date my.own.Date myOwndate ; // util.Date Date utilDate; } }
如果您真的想要或需要使用两个不同包中的相同类名,则有两种select:
1select一个用于导入并使用另一个完全合格的类名称:
import my.own.Date; class Test{ public static void main(String[] args){ // I want to choose my.own.Date here. How? //Answer: Date ownDate = new Date(); // I want to choose util.Date here. How ? //Answer: java.util.Date utilDate = new java.util.Date(); } }
2 – 始终使用完全合格的class级名称:
//no Date import class Test{ public static void main(String[] args){ // I want to choose my.own.Date here. How? //Answer: my.own.Date ownDate = new my.own.Date(); // I want to choose util.Date here. How ? //Answer: java.util.Date utilDate = new java.util.Date(); } }
我只是有同样的问题,我做了什么,我按顺序安排库顺序,例如有java.lang.NullPointerException和javacard.lang.NullPointerException。 我将第一个作为默认库,如果需要使用另一个,则可以显式指定完整的合格类名称。