【问题标题】:In Java, can "void" be considered a primitive type?在 Java 中,可以将“void”视为原始类型吗?
【发布时间】:2011-01-13 15:11:21
【问题描述】:

我注意到 Eclipse JDT uses void as a primitive type。这可以认为是正确的吗?

【问题讨论】:

  • 我想知道void 是否表示一种类型?或者它仅仅是一个语法占位符?从 langspec 第 4 章的描述来看,void 听起来肯定不是一个类型。
  • 我已经证实了我的怀疑。 void 学究式地说,不是一种类型。
  • @"Johannes Schaub - litb" - 你能给我们提供启发你的确切参考吗?
  • @Lord 已经做到了。这是我读到的同样的东西,最终说服了我。 :)

标签: java eclipse void eclipse-jdt


【解决方案1】:

我发现,在这种情况下,您无法超越 Java 语言规范。很明显,void 不是原始的。

首先,void 不在list of primitive types 中。后来,JLS 明确指出:

Java 编程语言不允许“强制转换为 void”——void 不是类型 http://java.sun.com/docs/books/jls/third_edition/html/statements.html#5989(强调我的)

此外,void 出现在 list of keywords 中,而不是文字列表中。

您看到自己所做的事情的原因是 Michael Borgwardt 的 explained nicely

所以,回答你的标题:不。在 Java 中,void 不能被视为原语。回答您的问题:是的,Eclipse JDT 代码对于它需要做的事情是正确的。

【讨论】:

  • 就个人而言,我很困惑为什么现代编程语言没有遵循使用递归首字母缩写词命名“void”的nerdcore约定,例如VINAT:VINAT 不是一种类型。 :)
【解决方案2】:

No void 不是原始类型。它只是一个关键字,表示方法没有返回值。最接近的是 java.lang.Void 类,Javadocs 中将其描述为:

Void 类是不可实例化的 用于保存引用的占位符类 到代表的 Class 对象 Java 关键字 void。

JDT 中的存在仅仅是为代码构建 AST。如果您查看同一文档中的字段值描述,它会说:

原始类型的类型代码 “空白”。请注意,“void”在 它唯一的合法用途是作为 方法返回类型和作为类型 字面意思。

【讨论】:

    【解决方案3】:

    来自 Java 6 API docs

    公共布尔值 isPrimitive() - 确定指定的类 object 表示原始类型。

    返回:当且仅当时为真 class 代表一个原始类型

    我自己查了一下:

    void.class.getName() // void (OK)
    void.class.isPrimitive() // true (??)
    Void.class.getName() // java.lang.Void (OK)
    Void.class.isPrimitive() // false (OK)
    

    这是错误吗?我知道 void 是 not 原始类型(我认为它只是 keyword),但为什么 void.class.isPrimitive() 返回 true ?

    编辑: 我认为应该澄清一下,所以我建议 java:doc bug 7019906。在我看来应该是:

    公共布尔 isPrimitive() - 确定指定的类 object 表示原始类型或关键字 void

    返回:真当且仅当 class 表示原始类型或关键字 void

    【讨论】:

    • 我不会称其为错误,但是是的,它可能会非常具有误导性。而 JLS 并没有很好地解释这种情况。
    • 这可能会产生误导,但如果您费心进一步阅读 javadoc,这绝对不是错误:“有九个预定义的 Class 对象来表示 八种原始类型和 void. 这些由 Java 虚拟机创建,与它们所代表的 原始类型 具有相同的名称,即 boolean、byte、char、short、int、long、float、和双。”
    • 附带说明,该链接已损坏或不公开。
    【解决方案4】:

    来自您的链接:

    请注意,“void”的特殊之处在于它唯一的合法用途是作为 方法返回类型和作为类型 字面意思。

    还要注意,这是一个与 AST 节点有关的类,即 Java 语言的语法。

    基本上,在对语言语法进行建模时,void 与原始类型出现在某些相同的位置,因此当将语法表示为 Java 类时,您必须对其进行类似的分类。

    【讨论】:

      【解决方案5】:

      据我所知,void 它不是原始类型。然而,出于反思的原因,他们在 Type 类中有这个常量!

      【讨论】:

        【解决方案6】:

        这是您引用的 javadoc 中写的内容:

        原始类型“void”的类型代码。请注意,“void”是特殊,因为它唯一合法的用途是作为方法返回类型和类型文字。

        注意粗体字。我认为这解释了一切。

        【讨论】:

        • 一个特殊的原始类型仍然是原始类型。那么“特殊”这个词并不能解决任何问题吗?
        • 我同意 Johannes Schaub - litb
        【解决方案7】:

        我看到你为此争论了很多,但是...

        大家好,在 java.lang.Class 中有一个名为 isPrimitive() 的函数

        那么我们为什么不用 void 类对象来调用它并得到答案呢?

        此外,Void.TYPE 是使用 Class.getPrimitiveClass("void") 获取的。

        所以事实很清楚,void 是原始的。

        【讨论】:

        • 如果您阅读了isPrimitive() 函数的文档,很清楚void 不是一个原始类型:“有九个预定义的类对象来表示八种原始类型和 void。它们由 Java 虚拟机创建,与它们所代表的 原始类型具有相同的名称,即 boolean、byte、char、short、int、 long、float 和 double。"
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-09
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-25
        • 2020-06-27
        相关资源
        最近更新 更多