java—导入两个同名的类如何处理?

irlmq6kh  于 2021-07-14  发布在  Java
关注(0)|答案(11)|浏览(1210)

假设我有这样的代码:

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 ?

  }
}

我应该是完全限定的类名吗?我能把进口报表处理掉吗?这种情况在现实编程中常见吗?

p1iqtdky

p1iqtdky1#

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

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

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

fjaof16o

fjaof16o2#

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

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

xu3bshqb3#

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

java.util.Data date1 = new java.util.Date();
my.own.Date date2 = new my.own.Date();
vnzz0bqm

vnzz0bqm4#

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

package my.own;

public class FQNDate extends Date {

}

然后在包含java.util.date的包中导入my.own.fqndate。

eni9jsuy

eni9jsuy5#

如果您有自己的日期类,则应该将其与内置日期类区分开来。i、 你为什么要创造你自己的。像immutabledate、betterdate或nanodate之类的东西,甚至mydate都会指出为什么您有自己的date类。在这种情况下,它们将具有唯一的名称。

gr8qqesn

gr8qqesn6#

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

import java.util.Date;

class Test{

  public static void main(String [] args){

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

    // util.Date
    Date utilDate;
  }
}
ufj5ltwl

ufj5ltwl7#

这种情况在现实编程中并不常见,但也并不奇怪。有时,不同包中的两个类具有相同的名称,我们需要这两个类。
如果两个类具有相同的名称,那么两个类都将包含相同的功能,我们应该只选择其中一个,这不是强制性的。
如果我们两者都需要的话,那么使用它们也没有坏处。这也是一个不错的编程想法。
但我们应该使用类的完全限定名(具有相同名称的类),以便清楚地表明我们也在引用哪个类。
:)

hgqdbh6s

hgqdbh6s8#

例如,我在将一个类Map到另一个类时遇到了这个问题(例如切换到一组新的类来表示person数据)。在这一点上,您需要两个类,因为这就是代码的全部要点——将一个Map到另一个。而且在这两个地方都不能重命名类(同样,任务是Map,而不是改变其他人所做的)。
完全合格是一种方法。似乎不能同时包含这两个import语句,因为java担心“person”的含义。

v64noz0r

v64noz0r9#

如果确实希望或需要从两个不同的包中使用相同的类名,则有两个选项:
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();

  }
}
fnvucqvd

fnvucqvd10#

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

eivnm1vs

eivnm1vs11#

使用相同名称调用类时,必须显式指定从中调用类的包。
你可以这样做:

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

    @Override
    public String toString() {
        return "Foo{second class}";
    }
}

输出:

Foo{first class}
Foo{second class}

相关问题