【问题标题】:How to check type of variable in Java?如何检查Java中的变量类型?
【发布时间】:2011-04-28 23:35:16
【问题描述】:

如何检查以确保我的变量是 int、array、double 等...?

编辑:例如,如何检查变量是否为数组?有什么功能可以做到这一点吗?

【问题讨论】:

标签: java


【解决方案1】:
var.getClass().getSimpleName()

举个例子

String[] anArrayOfStrings = { "Agra", "Mysore", "Chandigarh", "Bhopal" };
List<String> strList = Arrays.asList(anArrayOfStrings); 

anArrayOfStrings.getClass().getSimpleName() //res =>  String[]
strList.getClass().getSimpleName() // res => ArrayList

【讨论】:

    【解决方案2】:
    public static void chkType(Object var){     
            String type = var.getClass().toString();
            System.out.println(type.substring(16));     
            //assertEquals(type,"class java.lang.Boolean");
            //assertEquals(type,"class java.lang.Character");
            //assertEquals(type,"class java.lang.Integer");
            //assertEquals(type,"class java.lang.Double");      
        }
    

    【讨论】:

    • 这会打印数据类型但不回答问题。数组检查在哪里?
    【解决方案3】:

    我在尝试使用泛型进行类似工作时遇到了这个问题。采取一些答案并添加 getClass().isArray() 我得到以下似乎有效的内容。

    public class TypeTester <T extends Number>{
    
    <T extends Object> String tester(T ToTest){
    
        if (ToTest instanceof Integer) return ("Integer");
        else if(ToTest instanceof Double) return ("Double");
        else if(ToTest instanceof Float) return ("Float");
        else if(ToTest instanceof String) return ("String");
        else if(ToTest.getClass().isArray()) return ("Array");
        else return ("Unsure");
    }
    }
    

    我用这个来调用它,其中 myArray 部分只是将一个数组放入 callFunction.tester() 来测试它。

    public class Generics {
    public static void main(String[] args) {
        int [] myArray = new int [10];
    
        TypeTester<Integer> callFunction = new TypeTester<Integer>();
        System.out.println(callFunction.tester(myArray));
    }
    }
    

    您可以将最后一行中的 myArray 换成 10.2F 来测试 Float 等

    【讨论】:

      【解决方案4】:

      基本上,例如:

      public class Kerem
      {
          public static void main(String[] args)
          {
              short x = 10;
              short y = 3;
              Object o = y;
              System.out.println(o.getClass()); // java.lang.Short
          }
      
      }
      

      【讨论】:

      • 一个小提示:当有一个 10 年的问题并且有 >10 个答案,其中一些有 >100 个赞成票时,那么它(不是不可能,但是)非常非常不太可能一个新的答案可以添加一些有用的东西(特别是当它只是一个代码 sn-p 说“这里,看,这会打印一些东西”......)
      【解决方案5】:

      Java 是一种静态类型语言,因此编译器会为您完成大部分检查。一旦您将变量声明为某种类型,编译器将确保它只被分配该类型的值(或该类型的子类型的值)。

      您给出的示例(int、数组、double)这些都是原语,它们没有子类型。因此,如果您将变量声明为int

      int x;
      

      您可以确定它只会保存 int 值。

      但是,如果您将变量声明为List,则该变量可能包含List 的子类型。这些示例包括ArrayListLinkedList 等。

      如果您确实有一个 List 变量,并且您需要知道它是否是一个 ArrayList,您可以执行以下操作:

      List y;
      ...
      if (y instanceof ArrayList) { 
        ...its and ArrayList...
      }
      

      但是,如果您发现自己认为需要这样做,您可能需要重新考虑您的方法。在大多数情况下,如果您遵循面向对象的原则,则不需要这样做。当然,每条规则都有例外。

      【讨论】:

      • instanceof 运算符只确定变量所引用对象的数据类型。它不会按照最初的要求确定实际 VARIABLE 的数据类型。
      【解决方案6】:

      您可以使用Java.lang.Class.getSimpleName() 方法轻松检查它,仅当变量具有非原始类型时。它不适用于原始类型 int 、long 等。

      参考 - Here is the Oracle docs link

      【讨论】:

        【解决方案7】:

        如果变量是未初始化的泛型类型,这些答案都不起作用

        据我所知,只能使用extremely ugly workaround,或者通过将初始化参数传递给您的函数,使其就地,请参见此处:

        <T> T MyMethod(...){ if(T.class == MyClass.class){...}}
        

        无效,因为您不能直接从 T 参数中提取类型,因为它在运行时被擦除。

        <T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}
        

        这是因为调用者负责在调用之前实例化变量out。如果调用时 out 为 null,这仍然会引发异常,但与链接解决方案相比,这是迄今为止最简单的方法

        我知道这是一种特定的应用程序,但是由于这是 google 上使用 java 查找变量类型的第一个结果(并且鉴于 T 是一种变量),我觉得应该是包括

        【讨论】:

          【解决方案8】:

          只需使用:

          .getClass().getSimpleName();
          

          例子:

          StringBuilder randSB = new StringBuilder("just a String");
          System.out.println(randSB.getClass().getSimpleName());
          

          输出:

          StringBuilder
          

          【讨论】:

          • 我建议注意,如果 randSB 为 NULL,这将不起作用。
          【解决方案9】:

          我对这些答案中的任何一个都不满意,而正确的答案没有解释和反对票,所以我四处搜索,找到了一些东西并对其进行了编辑,以便于理解。试一试,不要像人们希望的那样直截了当。

          //move your variable into an Object type
          Object obj=whatYouAreChecking;
          System.out.println(obj);
          
          // moving the class type into a Class variable
          Class cls=obj.getClass();
          System.out.println(cls);
          
          // convert that Class Variable to a neat String
          String answer = cls.getSimpleName();
          System.out.println(answer);
          

          这是一个方法:

          public static void checkClass (Object obj) {
              Class cls = obj.getClass();
              System.out.println("The type of the object is: " + cls.getSimpleName());       
          }
          

          【讨论】:

            【解决方案10】:

            a.getClass().getName() - 将为您提供a 引用的实际对象的数据类型,但不是变量a 最初声明为或随后转换为的数据类型。

            boolean b = a instanceof String - 将告诉您a 引用的实际对象是否是特定类的实例。 同样,变量 a 最初声明为或随后转换为的数据类型与 instanceof 运算符的结果无关。

            我从以下位置获取此信息: How do you know a variable type in java?

            这可能发生。我正在尝试将 String 解析为 int,我想知道我的 Integer.parseInt(s.substring(a, b)) 在尝试总结之前是踢出 int 还是垃圾。

            顺便说一下,这被称为反射。以下是有关该主题的更多信息:http://docs.oracle.com/javase/tutorial/reflect/

            【讨论】:

              【解决方案11】:

              嗯,我认为可以通过这种方式检查变量的类型。

              public <T extends Object> void checkType(T object) {    
                  if (object instanceof Integer)
                      System.out.println("Integer ");
                  else if(object instanceof Double)
                      System.out.println("Double ");
                  else if(object instanceof Float)
                      System.out.println("Float : ");
                  else if(object instanceof List)
                      System.out.println("List! ");
                  else if(object instanceof Set)
                      System.out.println("Set! ");
              }
              

              这样你就不需要有多个重载方法。我认为在数组上使用集合是一种很好的做法,因为它有额外的好处。话虽如此,我不知道如何检查数组类型。也许有人可以改进这个解决方案。希望这可以帮助!

              P.S 是的,我知道这也不会检查原语。

              【讨论】:

                【解决方案12】:

                您问题的第一部分毫无意义。没有任何情况下您在编译时不知道原始变量的类型。

                关于第二部分,您不知道变量是否为数组的唯一情况是它是否为对象。在这种情况下,object.getClass().isArray() 会告诉你。

                【讨论】:

                • 我可以有一个从字符串到对象的哈希映射,在该哈希映射中放入一个 int,然后将其拉回。我只知道它是一个“对象”,可能必须检查它是什么类型。不是说好,只是说有可能。
                【解决方案13】:

                我使用的是:if(x.getClass() == MyClass.class){...}

                【讨论】:

                  【解决方案14】:

                  实际上很容易通过滥用 Java 的方法重载能力来创建自己的测试器。虽然我还是很好奇sdk里有没有官方的方法。

                  例子:

                  class Typetester {
                      void printType(byte x) {
                          System.out.println(x + " is an byte");
                      }
                      void printType(int x) {
                          System.out.println(x + " is an int");
                      }
                      void printType(float x) {
                          System.out.println(x + " is an float");
                      }
                      void printType(double x) {
                          System.out.println(x + " is an double");
                      }
                      void printType(char x) {
                          System.out.println(x + " is an char");
                      }
                  }
                  

                  然后:

                  Typetester t = new Typetester();
                  t.printType( yourVariable );
                  

                  【讨论】:

                  • IMO 不是一个好方法。如果我传递了一些未在您的 Typetester 类中定义的任意类型——例如在本例中为 String,会发生什么?
                  • @TashPemhiwa 然后将 String 和 Object 添加到选项中。创造力和解决问题的能力是程序员最好的资产。
                  • 这仍然只能处理一组固定的预定义类(这违背了面向对象/多态的目的),并且只会为您提供任何其他类的对象的“未知类”
                  • 选择哪个签名发生在编译时,而不是运行时。所以这种技术不会告诉你任何你在编译时还不知道的东西。 docs.oracle.com/javase/specs/jls/se7/html/…
                  【解决方案15】:

                  您可以使用 Integer 代替 int、Double 代替 double 等(所有原始类型都存在此类类)。 然后你可以使用运算符 instanceof,比如if(var instanceof Integer){...}

                  【讨论】:

                  • 我们只需要一个有效的用例。
                  • 听起来是最有效的方法。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-12
                  • 2018-03-21
                  • 1970-01-01
                  • 2022-11-26
                  • 1970-01-01
                  • 2021-01-13
                  • 2021-11-17
                  相关资源
                  最近更新 更多