簡體   English   中英

在Java中,原始類型和數組是否包含包含?

[英]In Java, do primitive types and arrays have a containing package?

在Java中,原始類型和數組是否包含包含?

可能不是,但只是想確定。

簡單的答案

我們來測試一下:

public static void main(final String[] args){
    System.out.println(long.class.getPackage());
    System.out.println(Object[].class.getPackage());
}

輸出:

空值
空值

不,他們沒有:-)


原始類型

原始類是沒有包的特殊構造。 為了參考,見的源Long.TYPE ,別名為long.class

/**
 * The <code>Class</code> instance representing the primitive type
 * <code>long</code>.
 *
 * @since   JDK1.1
 */
public static final Class<Long> TYPE =
       (Class<Long>) Class.getPrimitiveClass("long");

如您所見,原始類通過包私有和本機機制加載:

static native Class getPrimitiveClass(String name);

並轉換為Class<Long> (為了啟用自動裝箱,我猜)

包裝類型及其原始類型

BTW:每個包裝類都有一個名為TYPE的靜態最終字段,映射到相應的基本類,如下面的代碼所示:

private static Class<?> getPrimitiveClass(final Class<?> wrapperClass){
    try{
        final Field field = wrapperClass.getDeclaredField("TYPE");
        final int modifiers = field.getModifiers();
        if(Modifier.isPublic(modifiers) && Modifier.isStatic(modifiers)
            && Modifier.isFinal(modifiers)
            && Class.class.equals(field.getType())){
            return (Class<?>) field.get(null);
        } else{
            throw new IllegalArgumentException("This is not a wrapper class: "
                + wrapperClass);
        }
    } catch(final NoSuchFieldException e){
        throw new IllegalArgumentException("This is not a wrapper class:"
            + wrapperClass + ", field TYPE doesn't exists.", e);
    } catch(final IllegalAccessException e){
        throw new IllegalArgumentException("This is not a wrapper class:"
            + wrapperClass + ", field TYPE can't be accessed.", e);
    }
}

public static void main(final String[] args){
    final List<Class<?>> wrappers =
        Arrays.<Class<?>> asList(
            Byte.class, Long.class, Integer.class,
            Short.class, Boolean.class, Double.class
            // etc.
        );
    for(final Class<?> clazz : wrappers){
        System.out.println("Wrapper type: " + clazz.getName()
            + ", primitive type: "
            + getPrimitiveClass(clazz).getCanonicalName());
    }

}

輸出:

包裝類型:java.lang.Byte,原始類型:byte
包裝類型:java.lang.Long,原始類型:long
包裝類型:java.lang.Integer,原始類型:int
包裝類型:java.lang.Short,原始類型:short
包裝類型:java.lang.Boolean,原始類型:boolean
包裝類型:java.lang.Double,原始類型:double


數組類型

可以通過Array.newInstance(type, length)創建數組,它在內部調用此方法:

private static native Object newArray(Class componentType, int length)
throws NegativeArraySizeException;

所以,類是由本機代碼創建的特殊構造(並且它們沒有包,否則你可以在某處找到它們)

不,他們沒有,因為他們不是上課。

基元 :基本類型由語言預定義,並由保留關鍵字命名。

array :數組是一個容器對象,它包含固定數量的單個類型的值。

不,但是有一些對象可以在java.lang包中包裝原始數據類型。

http://download.oracle.com/javase/6/docs/api/java/lang/package-summary.html

不,因為它們是語言結構而不是類本身。

但是,您可以在包裝器中有一個表示基本類型的類,例如:

Integer.TYPE等。 對反射很有用。

但是你會看到那些還沒有包裝,即。

Integer.TYPE.getPackage()

返回null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM