在Java中,原始类型和数组是否具有包含包?
可能不是,但是只是想确定一下。
让我们测试一下:
public static void main(final String[] args){
System.out.println(long.class.getPackage());
System.out.println(Object[].class.getPackage());
}
输出:
空
null
不,他们不:-)
原始类是没有包的特殊构造。供参考,请参阅的来源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");
如您所见,原始类是通过package-private和native机制加载的:
static native Class getPrimitiveClass(String name);
并投射到Class<Long>
(我想为了启用自动装箱)
顺便说一句:每个包装器类都有一个静态的final字段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,原始类型:字节
包装类型:java.lang.Long,原始类型:long
包装类型:java.lang.Integer,原始类型:int
包装类型:java.lang.Short,原始类型:简短的
包装类型:java.lang.Boolean,原始类型:布尔
型包装类型:java.lang.Double,原始类型:double
可以通过创建数组Array.newInstance(type, length)
,该数组在内部调用此方法:
private static native Object newArray(Class componentType, int length)
throws NegativeArraySizeException;
同样,这些类是由本机代码创建的特殊结构(它们没有包,否则您可以在某个地方找到它们)
问题内容: 我正在将代码从Java手动转换为C#,并在原始类型(我称之为)方面苦苦挣扎(请参见例如,自动装箱和拆箱在Java和C#中的行为是否不同)。从答案中我了解到(C#)和(C#)是等效的,并且(C#)也可以在容器中使用,例如,作为Dictionary中的键。但是,(Java)不能在HashMap这样的容器中使用,这就是为什么将其自动装箱到(Java)。 是(C#)一个原始或对象? 如果它是原
问题内容: 如果我在代码中使用如下语句 它将数组初始化为特定的东西吗?(例如0)我似乎记得此文件记录在某处,但我不确定要搜索什么。 问题答案: JLS说,在15.10数组创建表达式中 […]创建具有指定长度的一维数组,并将数组的每个组件初始化为其默认值 在4.12.5变量的初始值处表示: 对于type ,默认值为零,即。
问题内容: 如果有Wrapper类使Java成为纯面向对象的语言,那么为什么会有可在Java中使用的Primitive数据类型呢? 问题答案: 为了效率。基本类型的变量直接包含值。非基本类型的变量是引用,引用存储在内存中其他位置的对象。 每次您需要使用包装器类型的值时,JVM都需要在内存中查找对象以获取该值。对于原始类型,这不是必需的,因为变量本身包含值,而不是对包含该值的对象的引用。 但是,这不
问题内容: 我是Kotlin的新手,正在玩数据类型。我选择了一个类型,然后尝试通过说来将其强制转换为a ,这在Java中是有效的(从语法上讲,但这是正确的)。但是,此操作失败,表示无法将Int强制转换为Double。我假设这是因为它是基于Integer类而不是原始的int数据类型构建的。我是正确的,最有价值的方法是什么?有一个功能,但这似乎效率低下且笨拙。 问题答案: 我花了一个类型,然后试图将它
问题内容: 我今天遇到了与此类似的代码。 似乎暗示数据类型信息可以与NULL值关联。这是否将元数据附加到将其标识为指定数据类型的NULL值? 这篇文章详细介绍了一种在SqlServer中查找数据类型的方法,但是当我尝试以下行时,它以NULL的形式返回: 问题答案: 在SQL Server中,是在默认情况下所有我能想到的场景。您可以使用以下代码确定这一点: 结果: 在将其放入表中或将其与某些上下文元