我对Java中的基本类型(int
,double
,long
等)有疑问。
问题一:
Java中是否有一种方法可以拥有一种数据类型,让我们说XType
(无损类型)可以容纳任何基本类型?
假设用法示例:
int x = 10;
double y = 9.5;
XType newTypeX = x;
XType newTypeY = y;
int m = newTypeX;
问题二:
如果这个数字(原始类型)是一个整数,或者是double,还是一个浮点数等,是否可以告诉它?
答案 0 :(得分:4)
您可以在第一个代码段中使用Number
类,这是所有numeric primitive wrapper classes的超类:
int x = 10;
double y = 9.5;
Number newTypeX = x;
Number newTypeY = y;
原始类型(int
,double
)和对象类型(Number
)之间的转换可以通过名为autoboxing的功能进行。但是,这一行不会编译:
int m = newTypeX;
因为您无法将超类型变量分配到int
。编译器在这里不知道newTypeX
的确切类型(即使之前已为其分配int
值);尽管如此,变量也可以是double
。
要获取Number
变量的运行时类型,您可以例如使用getClass
方法:
System.out.println(newTypeX.getClass());
System.out.println(newTypeY.getClass());
与示例代码段一起使用时,将打印出
class java.lang.Integer class java.lang.Double
答案 1 :(得分:0)
嗯,你可以这样做:
Integer i = 1;
Float f = 2f;
Object[] obArr = new Object[]{i, f};
Float fReconstruct = (Float) obArr[2]
不是真正的原始类型,但是你可以得到最接近的类型!
答案 2 :(得分:0)
关于您的第一个问题,您可以使用Number课程。
答案 3 :(得分:0)
您可以使用对象来保存对这些类型中的任何类型的引用,但它将被设置为“#”;它的包装器(int将作为整数保持,只要长,等等)...
答案 4 :(得分:0)
还没有(java 8),而不是你希望得到原始值的方式。但是如果不是持有基本类型,而是保存一个基本类型包装器(它们是从Object
类继承的类并包装它们相应的原语,即Byte
包裹byte
,{{1 } {}包裹Integer
,int
包裹Long
等等,然后你可以这样做:
long
您可以使用此public class Holder<T extends Number> {
private final T number;
public Holder(T number) {
this.number = number;
}
public T get() {
return this.number;
}
}
类来保存Holder
,的任何子类的实例,包括基本类型包装器。例如:
Number
由于Java的一个名为Generics的功能以及另一个名为autoboxing的功能,上述情况是可能的。
Extending generics to support primitive types正在考虑用于Java 9或10(不确定),在术语专业化下。从理论上讲,这将允许你:
Holder<Integer> holderX = new Holder<>(5);
Holder<Double> holderY = new Holder<>(1.234);
int x = holderX.get(); // 5
double y = holderY.get(); // 1.234
答案 5 :(得分:-1)
泛型是通用编程的工具,它在2004年在J2SE 5.0中添加到Java编程语言中。它们允许“一种类型或方法对各种类型的对象进行操作,同时提供编译时类型安全性。
举个例子,我喜欢tutorialspoint上的那个:
public class GenericMethodTest
{
// generic method printArray
public static < E > void printArray( E[] inputArray )
{
// Display array elements
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
public static void main( String args[] )
{
// Create arrays of Integer, Double and Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println( "Array integerArray contains:" );
printArray( intArray ); // pass an Integer array
System.out.println( "\nArray doubleArray contains:" );
printArray( doubleArray ); // pass a Double array
System.out.println( "\nArray characterArray contains:" );
printArray( charArray ); // pass a Character array
}
}
这会产生以下结果:
Array integerArray contains:
1 2 3 4 5 6
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O Array integerArray contains:
1 2 3 4 5 6
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O
有关this link的更多信息。