Làm thế nào để bạn biết một loại biến trong java?


152

Giả sử tôi khai báo một biến:

String a = "test";

Và tôi muốn biết nó là loại gì, tức là, đầu ra phải là java.lang.StringLàm thế nào để tôi làm điều này?


1
Bạn có thực sự quan tâm đến các loại biến ? Hay bạn quan tâm đến loại giá trị ? Bởi vì loại biến không thể dễ dàng nhận được (thực tế là hoàn toàn không thể đối với biến cục bộ và yêu cầu phản xạ cho các trường).
Joachim Sauer

8
@Paul: Xem xét Object o = "o";- loại biến là Object, loại giá trị là String.
Michael Borgwardt

2
@Paul Trong List<String> l = new ArrayList<String>();, loại biến là List<String>, loại giá trị là ArrayList<String>.
Ben Lings

1
@Ben Lings Loại biến là java.util.ArrayList và loại giá trị là java.util.ArrayList.
Ajay Takur

1
@AjayThakur - đó là sự khác biệt giữa loại thời gian biên dịch (tĩnh) và loại thời gian chạy (động).
Ben Lings

Câu trả lời:


269
a.getClass().getName()

16
Điều đó sẽ đưa ra loại giá trị. không nhất thiết là loại biến.
Joachim Sauer

7
Tôi chỉ hình dung đó là những gì OP thực sự tìm kiếm vì tuyên bố akhá rõ ràng vào thời gian biên dịch
Martin

4
Điều đó sẽ hoạt động nếu các loại không phải là nguyên thủy ... Nếu loại là int, làm thế nào để biết loại?
Miguel Ribeiro

5
@Miguel: vì cách duy nhất bạn có thể xử lý một intgiá trị là trong một intbiến, không có cách nào để viết mã xử lý một intgiá trị và không biết loại đó. Vấn đề là khác nhau trong trường hợp bạn đang xử lý một trình bao bọc như thế nào Integer, nhưng sau đó mã của câu trả lời này hoạt động trở lại.
Joachim Sauer

1
Điều này không đúng với kiểu nguyên thủy.
Mehdi

37

Nếu bạn muốn tên, sử dụng phương pháp của Martin. Nếu bạn muốn biết liệu đó có phải là một thể hiện của một lớp nào đó không:

boolean b = a instanceof String


15
Martin cũng vậy à? :)
seokhoonlee

Martin khác ... LOL;)
chankruze

Mã thic Double a = 1d; boolean b = a instanceof String;sẽ gây ra lỗierror: incompatible types: Double cannot be converted to String
Alex78191

35

Tôi muốn mở rộng câu trả lời của Martin ở đó ...

Giải pháp của anh ấy khá hay, nhưng nó có thể được điều chỉnh để bất kỳ "loại biến" nào cũng có thể được in như thế. (Đó thực sự là Loại giá trị, thêm về chủ đề ). Điều đó nói rằng, "điều chỉnh" có thể là một từ mạnh mẽ cho điều này. Bất kể, nó có thể hữu ích.

Giải pháp Martins:

a.getClass().getName()

Tuy nhiên, nếu bạn muốn nó hoạt động với bất cứ điều gì bạn có thể làm điều này:

((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()

Trong trường hợp này, người nguyên thủy sẽ đơn giản được bọc trong Wrapper. Bạn sẽ nhận được Object của nguyên thủy trong trường hợp đó.

Bản thân tôi đã sử dụng nó như thế này:

private static String nameOf(Object o) {
    return o.getClass().getSimpleName();
}

Sử dụng Generics:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}

Hấp dẫn. Tôi vừa thử mã của bạn trên: System.out.println (((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); Và nó hoạt động! \ o /
shevy

31

Tôi đã học được từ Công cụ tìm kiếm (Tiếng Anh của tôi rất tệ, vì vậy mã ...) Làm thế nào để có được loại biến? Lên:

String str = "test";
String type = str.getClass().getName();
value: type = java.lang.String

phương pháp này :

str.getClass().getSimpleName();
value:String

bây giờ ví dụ:

Object o = 1;
o.getClass().getSimpleName();
value:Integer

3

Tôi đồng ý với những gì Joachim Sauer đã nói, không thể biết (loại biến! Không phải loại giá trị!) Trừ khi biến của bạn là thuộc tính lớp (và bạn sẽ phải truy xuất các trường lớp, lấy đúng trường theo tên ...)

Trên thực tế đối với tôi, không có a.xxx().yyy()phương pháp nào cung cấp cho bạn câu trả lời đúng vì câu trả lời sẽ khác nhau trên cùng một đối tượng, theo ngữ cảnh mà bạn gọi phương thức này ...

Như teehoo đã nói, nếu bạn biết lúc biên dịch một danh sách các loại đã xác định để kiểm tra, bạn có thể sử dụng instanceof nhưng bạn cũng sẽ nhận được các lớp con trả về đúng ...

Một giải pháp khả thi cũng là truyền cảm hứng cho bạn từ việc triển khai java.lang.reflect.Fieldvà tạo Fieldlớp của riêng bạn , sau đó khai báo tất cả các biến cục bộ của bạn dưới dạng Fieldtriển khai tùy chỉnh này ... nhưng tốt hơn bạn nên tìm một giải pháp khác, tôi thực sự tự hỏi tại sao bạn cần biến đó loại, và không chỉ là loại giá trị?


Đối với "nhưng bạn cũng sẽ nhận được các lớp con trở về đúng ..." , tôi nghĩ bạn có nghĩa là "nhưng bạn cũng sẽ khiến các lớp cha mẹ trở về đúng ..." , phải không?
skomisa

3

Sử dụng tính năng nạp chồng toán tử của java

class Test {

    void printType(String x) {
        System.out.print("String");
    }

    void printType(int x) {     
        System.out.print("Int");
    }

    // same goes on with boolean,double,float,object ...

}

8
Java không có khái niệm về quá tải toán tử, đây là quá tải phương thức
nicoschl

2

Tôi nghĩ rằng chúng tôi có nhiều giải pháp ở đây:

  • ví dụ có thể là một giải pháp.

Tại sao? Trong Java, mọi lớp được kế thừa từ chính lớp Object. Vì vậy, nếu bạn có một biến và bạn muốn biết loại của nó. Bạn có thể dùng

  • System.out.println (((Đối tượng) f) .getClass (). GetName ());

hoặc là

  • Integer. Class.isInstance (1985); // cho đúng

hoặc là

  • isPrimitive ()

    public static void main(String[] args) {
    
     ClassDemo classOne = new ClassDemo();
     Class classOneClass = classOne();
    
     int i = 5;
     Class iClass = int.class;
    
     // checking for primitive type
     boolean retval1 = classOneClass.isPrimitive();
     System.out.println("classOneClass is primitive type? = " + retval1);
    
     // checking for primitive type?
     boolean retval2 = iClass.isPrimitive();
     System.out.println("iClass is primitive type? = " + retval2);
    }

Điều này sẽ cung cấp cho chúng tôi:

  1. SAI
  2. THẬT

Tìm hiểu thêm tại đây: Làm thế nào để xác định loại nguyên thủy của một biến nguyên thủy?

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.