【问题标题】:Datatypes in Java and their representationJava中的数据类型及其表示
【发布时间】:2015-10-14 12:22:16
【问题描述】:

我对 Java 中的原始类型有疑问(intdoublelong 等)。

问题一:

Java 中有没有办法拥有一个数据类型,比如说XType(无损类型),它可以保存任何原始类型? 假设用法示例:

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

int m = newTypeX;

问题二:

如果这个数字(原始类型)是整数、双精度还是浮点数等,是否可以从位中判断?

【问题讨论】:

标签: java types primitive-types


【解决方案1】:

您可以在您的第一个 sn-p 中使用 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());

当与示例 sn-p 一起使用时,这将打印出来

类 java.lang.Integer 类 java.lang.Double

【讨论】:

  • Java 5.0 附带自动装箱,在您必须编写 Number x = new Integer(10); 之前,您可以使用 instanceof 获得类型,但它会变成丑陋的 if。根据具体情况,重载方法可能比使用Number 更好。
【解决方案2】:

好吧,你可以这样做:

Integer i = 1;
Float f = 2f;
Object[] obArr = new Object[]{i, f};
Float fReconstruct = (Float) obArr[2]

不是真正的原始类型,而是你能得到的最接近的类型!

【讨论】:

    【解决方案3】:

    关于您的第一个问题,您可以使用Number 类。

    【讨论】:

      【解决方案4】:

      您可以使用 Object 来保存对任何这些类型的引用,但它将被“装箱”到它的包装器中(int 将被保存为 Integer,long 为 Long 等)...

      【讨论】:

        【解决方案5】:

        还没有(java 8),并且不是以您想要取回原始值的方式。但是,如果不是持有原始类型,而是持有原始类型包装器(它们是从Object 类继承并包装其相应原始类型的类,即Byte 包装byteInteger 包装int,@ 987654330@ 包裹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 的任何子类的实例,包括原始类型包装器。例如:

        Holder<Integer> holderX = new Holder<>(5);
        Holder<Double> holderY = new Holder<>(1.234);
        
        int x = holderX.get(); // 5
        double y = holderY.get(); // 1.234
        

        由于 Java 的一个名为 Generics 的特性以及另一个名为 autoboxing 的特性,上述情况成为可能。

        Extending generics to support primitive types 正在考虑用于 Java 9 或 10(不确定),在 Specialization 术语下。理论上,这将允许您:

        List<int> list = new ArrayList<int>();
        

        Here is a draft.

        【讨论】:

          【解决方案6】:

          泛型是一种泛型编程工具,于 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的更多信息。

          【讨论】:

            猜你喜欢
            • 2017-06-30
            • 1970-01-01
            • 2011-07-31
            • 1970-01-01
            • 1970-01-01
            • 2019-03-08
            • 2012-04-21
            • 2010-10-27
            • 2011-09-13
            相关资源
            最近更新 更多