Java中的数据类型及其表示形式

时间:2015-07-24 00:14:33

标签: java types primitive-types

我对Java中的基本类型(intdoublelong等)有疑问。

问题一:

Java中是否有一种方法可以拥有一种数据类型,让我们说XType(无损类型)可以容纳任何基本类型? 假设用法示例:

int x = 10;
double y = 9.5;
XType newTypeX = x;
XType newTypeY = y;

int m = newTypeX;

问题二:

如果这个数字(原始类型)是一个整数,或者是double,还是一个浮点数等,是否可以告诉它?

6 个答案:

答案 0 :(得分:4)

您可以在第一个代码段中使用Number类,这是所有numeric primitive wrapper classes的超类:

int x = 10;
double y = 9.5;
Number newTypeX = x;
Number newTypeY = y;

原始类型(intdouble)和对象类型(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课程。enter image description here

答案 3 :(得分:0)

您可以使用对象来保存对这些类型中的任何类型的引用,但它将被设置为“#”;它的包装器(int将作为整数保持,只要长,等等)...

答案 4 :(得分:0)

还没有(java 8),而不是你希望得到原始值的方式。但是如果不是持有基本类型,而是保存一个基本类型包装器(它们是从Object类继承的类并包装它们相应的原语,即Byte包裹byte,{{1 } {}包裹Integerint包裹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

Here is a draft

答案 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的更多信息。