Java ClassA中ClassA的导入语句??为什么设计师允许这样做。?

Java ClassA中ClassA的导入语句??为什么设计师允许这样做。?,java,import,Java,Import,我对java中的import语句有以下疑问 package com.punith.test; import **com.punith.test.ClassA**; public class ClassA { } 因此,在上面的代码中,我被允许导入定义ClassA的同一个类。那么为什么设计师允许这样做,而不是将编译错误更正为警告呢 问候 Punith导入类本身不会产生编译错误,但将其作为导入到类本身是没有意义的 关于你的问题,我有一些想法 首先,让我们考虑一下

我对java中的import语句有以下疑问

    package com.punith.test;
    import **com.punith.test.ClassA**;

    public class ClassA {

    }
因此,在上面的代码中,我被允许导入定义ClassA的同一个类。那么为什么设计师允许这样做,而不是将编译错误更正为警告呢

问候
Punith

导入类本身不会产生编译错误,但将其作为导入到类本身是没有意义的

关于你的问题,我有一些想法

首先,让我们考虑一下,编译器为什么不推荐一些代码结构?在那种情况下?显然,任何编译器错误都是代码中不可理解部分的信号,无法正确地转换为低级指令,因此JVM无法对其进行解释。所有其他毫无意义或荒谬,但可以实施的案例都没有遭到反对。例如,您还可以在Java中执行许多无意义的操作:

public void nop() {
    int i;
}

其次,关于导入的思考语句并不完全是关于您的问题,但它离您的问题很近。还有
import static
语句。在这种情况下,同一类的静态导入(在本文件中描述)是明智的。例如,在这种情况下它是有用的:

package xxx;
import static xxx.TestEnum.Test.*;
public class TestEnum {
    enum Test {
        TEST1,
        TEST2
    }
    public boolean isTest2(Test test) {
        return test == TEST2;
    }
}

在没有
导入静态xxx.TestEnum.Test.*
的代码中,我们不能使用
Test==TEST2这样的结构。如果没有这样的导入,它将是
编译错误
,我们必须将其更改为
return test==test.TEST2

这只是未使用导入的一种特殊情况,它不会引发编译错误。未使用的导入不会影响性能,因为这是您打算在运行时使用类的编译时指示器


有无数种方法可以创建无意义的代码;让每个人抛出一个编译时错误会使编译器变得相当复杂。最好依靠开发人员的常识,当常识失败时(太频繁),优化不可靠的代码-这种情况会发生。

为什么您认为这应该是编译器错误?为什么我要导入相同的类??抛出错误并使代码更高效,而不是其中的垃圾。。。我猜是“有什么原因吗”?“垃圾”并不意味着它是错的。它是冗余的,因此编译器警告更合适。不是编译器错误我想抛出一个错误,让代码更有效率-你说的效率是什么?这个类是由类加载器加载的,你有什么问题吗?@Punith未使用的导入对类加载器没有影响。导入不会在运行时保留;类加载器根据需要加载一个类。请在注释中提及这一点。这不是答案,也不是解释。我同意你的“无意义的代码”这句话,因为我被允许无限次地导入同一个语句,而编译器仍然对我微笑:)如果我们不被允许做那些毫无意义的事情,语言的设计会更好。。。无论如何,当我复制相同的导入语句10次时,我至少期望得到警告。编译器也没什么好抱怨的for@PunithRaj这是因为编译器非常聪明:他将在生成的二进制代码中消除这种导入。
int i = 1;
i = i;
package xxx;
import static xxx.TestEnum.Test.*;
public class TestEnum {
    enum Test {
        TEST1,
        TEST2
    }
    public boolean isTest2(Test test) {
        return test == TEST2;
    }
}