`void.class`表示什么?

时间:2015-10-11 19:09:57

标签: java class primitive-types

在我的代码中,我(意外地)编写了void.class not Void.class ),这是编译器乐意接受的。到现在为止,我认为这些原始人不是真正的对象(不仅void,还在谈论int等等......这里),所以他们没有课。

我在谈论所有“原始阶级”。每个基本类型都有一个由<primitivetype>.class表示的类,例如float.class

  • 这种“原始类”所指的是什么“Class”,例如void.class
  • 这些“原始类”的可能用例是什么?
    • 特别是,他们提供构造函数吗?
    • 我们可以进行有意义的实例检查,例如int.class.isInstance(2.3f)吗?

3 个答案:

答案 0 :(得分:5)

public T smallest() { // Don't mutate the order of the original array. ArrayList<T> listCopy = new ArrayList<>(l); Collections.sort(listCopy); return listCopy.get(0); } 是反射中使用的对象,表示方法具有void.class返回类型。如果您编写void,则可能会返回此对象。

method.getReturnType();可以表示参数和返回类型。

您可以撰写int.class,但它始终会返回int.class.isInstance(...),因为参数为false

没有Object对象具有可访问的构造函数。

Classint.class.getConstructors()都返回一个空数组。原始类型没有构造函数。

答案 1 :(得分:2)

Class的第一个明显问题是它也代表接口:)

在java5之前,Class用于表示所有java类型,包括基本类型。这是出于方便,它工作正常。

引入泛型之后,java类型变得更加丰富。引入java.lang.reflect.Type以包括所有类型。不幸的是,它结合了旧的凌乱Class,造成了更大的混乱。 Type的层次结构只是没有意义。

现在,void甚至不是一个类型!所以Class也包含非类型。正如其他答案所示,这是不方便的。同样,a wildcard is not a type either,还有WildcardType extends Type

void可以在开头设计为一种类型吗?为什么不。它是0位的原始类型,只有一个值(也就是单位类型)。如果人们写的话,我不确定怎么感觉

void foo(void param){
    param = bar();  // void bar(){...}

但至少如果我能写的话我会很高兴

void foo(...){
    return bar();

另见John Rose的comment

答案 2 :(得分:0)

Void是Reflection中使用的返回类型void的占位符。

示例: - void.class是返回void的方法的返回类型,如下面的main方法: -

import java.lang.reflect.Method;

public class A{
    public static void main(String[] args) throws NoSuchMethodException, SecurityException{

    Method mh = A.class.getMethod("main",String[].class);
    System.out.println(mh.getReturnType() == void.class);

    }
}