导入两个同名的类。怎么处理?

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 修改于2016-02-24
  • 该问题已被编辑
  • 提问者: Stack Overflow用户
  • 提问时间: 2010-01-17 11:06

假设我有这样一段代码:

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语句吗?这种情况在现实世界的编程中很常见吗?

浏览 710 关注 0 得票数 120
  • 得票数为Stack Overflow原文数据
原文
回答于2010-01-17
得票数 174

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

java.util.Date javaDate = new java.util.Date()
my.own.Date myDate = new my.own.Date();

但我要说的是,使用两个具有相同名称和相似函数的类通常不是最好的主意,除非你能真正弄清楚哪一个是哪个。

回答于2010-01-17
得票数 22

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

例如:

//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();
}
回答于2010-01-17
得票数 10

是的,当您导入具有相同简单名称的类时,您必须通过它们的完全限定类名来引用它们。我会保留import语句,因为当其他开发人员使用文件时,它可以让他们对文件中的内容有一种感觉。

java.util.Data date1 = new java.util.Date();
my.own.Date date2 = new my.own.Date();
操作
回答于2010-01-17
得票数 3

这种情况在现实世界的编程中并不常见,但也不是那么奇怪。有时,不同包中的两个类具有相同的名称,而我们需要这两个类。

如果两个类具有相同的名称,那么这两个类都将包含相同的功能,这并不是强制性的,我们应该只选择其中一个。

如果我们两者都需要,那么使用它并没有什么坏处。而且这也是一个不错的编程想法。

但我们应该使用类的完全限定名(具有相同的名称),以便明确我们引用的是哪个类。

:)

操作
回答于2010-01-17
得票数 5

如果你有自己的date类,你应该把它和内置的Date类区分开来。也就是说,你为什么要创建你自己的。像ImmutableDate或BetterDate或NanoDate,甚至MyDate这样的东西都会指出为什么你有自己的date类。在这种情况下,它们将有一个唯一的名称。

Stack Overflow用户
回答于2011-08-25
得票数 6

另一种方法是将其子类化:

package my.own;
public class FQNDate extends Date {
}

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

操作
回答于2013-04-13
得票数 2

例如,我在将一个类映射到另一个类时遇到了这个问题(例如,当切换到一组新的类来表示person数据时)。此时,您需要这两个类,因为这是代码的全部要点--将一个类映射到另一个类。并且您不能在这两个地方重命名类(同样,工作是映射,而不是去更改其他人所做的)。

完全合格是一种方法。看起来您实际上不能同时包含两个import语句,例如,Java会担心哪个"Person“是指哪个”Person“。

评论 0
0
回答于2016-02-29
得票数 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;
}
回答于2017-03-02
得票数 0

我只是遇到了同样的问题,我所做的是,我按顺序安排了库的顺序,例如,有java.lang.NullPointerException和javacard.lang.NullPointerException。我将第一个库设置为默认库,如果需要使用另一个库,则可以显式指定完全限定的类名。

Stack Overflow用户
回答于2017-10-07
得票数 3

如果您确实希望或需要使用来自两个不同包的相同类名,您有两个选择:

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

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();
}
修改于2018-10-29
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2018-10-29 03:45
得票数 0

当调用具有相同名称的类时,必须显式指定从中调用类的包。

你可以这样做:

import first.Foo;
public class Main {
    public static void main(String[] args) {
        System.out.println(new Foo());
        System.out.println(new second.Foo());
package first;
public class Foo {
    public Foo() {
    @Override
    public String toString() {
        return "Foo{first class}";
package second;
public class Foo {
    public Foo() {