导入两个具有相同名称的类.如何处理?

gam*_*ver 104 java

说我有一个像这样的代码:

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 ?

  }
}
Run Code Online (Sandbox Code Playgroud)

我应该是完全合格的班级名字吗?我能摆脱进口声明吗?在现实世界的编程中这种场景是常见的吗?

Ell*_* P. 141

您可以省略import语句并使用整个路径引用它们.例如:

java.util.Date javaDate = new java.util.Date()
my.own.Date myDate = new my.own.Date();
Run Code Online (Sandbox Code Playgroud)

但我会说,使用两个具有相同名称和类似功能的类通常不是最好的主意,除非你能清楚地知道哪个是哪个.

  • 我不同意上次发言.如果你想设计自己的Date类,`Date`就是完美的名字.您将在大多数代码中使用它.但是,有时您需要调用`java.util.Date`来显示两者之间的转换. (16认同)
  • @Yatendra这就是为什么我把它添加为评论而不是答案.我正在扩大她在答案结束时所做的观点.Roger可能知道这一点,但SO的目的是帮助其他开发人员,而不仅仅是提出问题的人.如果人们不了解IDE功能,他们可能会认为手动切换名称是不可行的,所以我认为投入该信息会很有用. (11认同)
  • 我最常见的名称冲突发生在`org.apache.log4j.Logger`和`java.util.logging.Logger`中.通常,我无法控制一方或另一方; 我正在进行遗留代码集成. (5认同)
  • 如果您正在使用Eclipse,则可以使用ctrl + shift + R更改`your.own.Date`的名称.这将在您的代码中引用它的任何地方以及您/ own/Date.java的文件(和文件名)中自动更改它.任何其他IDE可能具有类似的功能. (2认同)
  • @MatrixFrog您指定的Eclipse中的功能也由Netbeans IDE提供.此功能称为"重构".您的信息没有错,但这不是问题的答案.如果他(罗杰)正在开发该代码,那么他肯定知道他可以改变或重构他的班级名称.他的要求与你给出的答案不同. (2认同)
  • 一个新的问题是为什么Java没有“导入为” (2认同)

Chi*_*hii 20

使用完全限定名称而不是导入类.

例如

//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();
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 最佳实践是导入最常用的一个,使用最少使用的类路径 (6认同)

D.C*_*.C. 9

是的,当您导入具有相同简单名称的类时,必须通过其完全限定的类名称来引用它们.我会留下import语句,因为它让其他开发人员了解文件在使用它时的内容.

java.util.Data date1 = new java.util.Date();
my.own.Date date2 = new my.own.Date();
Run Code Online (Sandbox Code Playgroud)


Che*_*vim 8

另一种方法是子类化它:

package my.own;

public class FQNDate extends Date {

}
Run Code Online (Sandbox Code Playgroud)

然后在包含java.util.Date的包中导入my.own.FQNDate.

  • 这是一个不好的做法。除非从原始类扩展了某些功能,否则不应扩展类。 (2认同)

Pet*_*rey 5

如果您有自己的日期类,您应该将它与内置的 Date 类区分开来。即你为什么要创建自己的。像 ImmutableDate 或 BetterDate 或 NanoDate 之类的东西,甚至 MyDate 都会表明你为什么有自己的日期类。在这种情况下,它们将具有唯一的名称。


Anu*_*raj 5

您可以使用 import 导入其中之一。对于所有其他类似的类,您需要指定完全限定的类名。否则你会得到编译错误。

例如:

import java.util.Date;

class Test{

  public static void main(String [] args){

    // your own date
    my.own.Date myOwndate ;

    // util.Date
    Date utilDate;
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您确实想要或需要使用两个不同包中的相同类名,您有两种选择:

1-选择一个在导入中使用,并使用另一个的完全限定类名:

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();

     }
}
Run Code Online (Sandbox Code Playgroud)


2-始终使用完全限定的类名:

//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();

  }
}
Run Code Online (Sandbox Code Playgroud)