2010-10-22 67 views
80

Làm cách nào để kiểm tra để đảm bảo biến của tôi là int, array, double, etc ...?Làm thế nào để kiểm tra loại biến trong Java?

Chỉnh sửa: Ví dụ: làm cách nào tôi có thể kiểm tra xem biến có phải là một mảng không? Có một số chức năng để làm điều này?

+0

Hãy xem đến [Reflection API] (http://download.oracle.com/javase/tutorial/reflect/). – mschonaker

Trả lời

8

Bạn có thể làm việc với Integer thay vì int, Double thay vì double, vv (các lớp như vậy tồn tại cho tất cả các kiểu nguyên thủy). Sau đó, bạn có thể sử dụng toán tử instanceof, như if(var instanceof Integer){...}

+2

Tất cả những gì chúng tôi cần là trường hợp sử dụng hợp lệ. – EJP

+0

Âm thanh như cách tiếp cận hiệu quả nhất. –

76

Java là ngôn ngữ được nhập tĩnh, do đó trình biên dịch thực hiện hầu hết việc kiểm tra này cho bạn. Khi bạn khai báo một biến là một kiểu nhất định, trình biên dịch sẽ đảm bảo rằng nó chỉ là các giá trị được gán của kiểu đó (hoặc các giá trị là các kiểu con của kiểu đó).

Các ví dụ bạn đã cung cấp (int, array, double) tất cả đều là nguyên thủy và không có loại phụ nào trong số chúng. Vì vậy, nếu bạn khai báo một biến là một int:

int x; 

Bạn có thể chắc chắn nó sẽ chỉ bao giờ giữ int giá trị.

Nếu bạn tuyên bố biến là List, tuy nhiên, có thể biến sẽ giữ loại phụ là List. Ví dụ về các bao gồm ArrayList, LinkedList vv

Nếu bạn đã có một biến List, và bạn cần phải biết nếu nó là một ArrayList, bạn có thể làm như sau:

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

Tuy nhiên, nếu bạn thấy mình nghĩ rằng bạn cần phải làm điều đó, bạn có thể muốn nghĩ lại cách tiếp cận của bạn. Trong hầu hết các trường hợp, nếu bạn làm theo các hiệu trưởng hướng đối tượng, bạn sẽ không cần phải làm điều này. Có, tất nhiên, ngoại lệ cho mọi quy tắc, mặc dù.

+0

Toán tử instanceof chỉ xác định kiểu dữ liệu của đối tượng được tham chiếu bởi biến. Nó không xác định kiểu dữ liệu của VARIABLE thực tế như được yêu cầu ban đầu. – GrantRobertson

7

Phần đầu tiên của câu hỏi là vô nghĩa. Không có hoàn cảnh nào mà bạn không biết loại biến nguyên thủy ở thời gian biên dịch.

Phần thứ hai, trường hợp duy nhất mà bạn chưa biết liệu biến là một mảng có phải là một đối tượng hay không. Trong trường hợp này, object.getClass().isArray() sẽ cho bạn biết.

+4

Tôi có thể có một hashmap từ chuỗi đối tượng, đặt một int trong hashmap đó, và kéo nó trở lại. Điều duy nhất tôi biết là nó là một "đối tượng" và có thể phải kiểm tra xem loại đó là gì. Không nói nó tốt, chỉ cần nói rằng nó có thể. –

+0

@ matty-d Tất nhiên, nhưng đó không phải là những gì anh ta hỏi. – EJP

28

Thực tế khá dễ dàng để cuộn thử nghiệm của riêng bạn, bằng cách lạm dụng khả năng quá tải của phương thức Java. Mặc dù tôi vẫn còn tò mò nếu có một phương pháp chính thức trong sdk.

Ví dụ:

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"); 
    } 
} 

thì:

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

Không phải là phương pháp hay IMO. Điều gì sẽ xảy ra nếu tôi vượt qua một số loại tùy ý không được định nghĩa trong lớp Typetester của bạn - ví dụ trong String này? –

+4

@TashPemhiwa rồi thêm Chuỗi và đối tượng vào các lựa chọn. Sáng tạo và giải quyết vấn đề là một phần mềm lập trình tốt nhất. – Kato

+5

Tuy nhiên, điều này chỉ có thể đối phó với một tập hợp các lớp được xác định trước (mà đánh bại mục đích định hướng đối tượng/đa hình) và sẽ chỉ cung cấp cho bạn một cái gì đó như "lớp không xác định" cho các đối tượng của bất kỳ lớp nào khác – Algoman

13

a.getClass().getName() - sẽ cung cấp cho bạn các kiểu dữ liệu của đối tượng thực tế được gọi bằng a, nhưng không phải là kiểu dữ liệu mà biến a ban đầu được khai báo là hoặc sau đó truyền đến.

boolean b = a instanceof String - sẽ cho bạn biết đối tượng thực sự được đề cập bởi a là phiên bản của một lớp cụ thể hay không. Một lần nữa, kiểu dữ liệu mà biến a ban đầu được khai báo là hoặc sau đó được đúc thành không có kết quả của toán tử instanceof.

tôi lấy thông tin này từ: How do you know a variable type in java?

Điều này có thể xảy ra. Tôi đang cố gắng để phân tích một số String thành một int và tôi muốn biết nếu Integer.parseInt(s.substring(a, b)) của tôi đang khởi động một int hoặc rác trước khi tôi cố gắng tổng hợp nó.

Nhân tiện, điều này được gọi là Phản ánh. Dưới đây là một số thông tin về đề tài này: http://docs.oracle.com/javase/tutorial/reflect/

5

tôi đã làm nó bằng cách sử: if(x.getClass() == MyClass.class){...}

-3

public class Demo1 {

Object printType(Object o) 
{ 
    return o; 
} 
public static void main(String[] args) { 

    Demo1 d=new Demo1(); 
    Object o1=d.printType('C'); 
    System.out.println(o1.getClass().getSimpleName()); 

} 

}

5

Vâng, tôi nghĩ rằng việc kiểm tra kiểu của biến thể được thực hiện theo cách này.

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! "); 
} 

Bằng cách này bạn không cần phải có nhiều phương thức quá tải. Tôi nghĩ rằng đó là thực hành tốt để sử dụng các bộ sưu tập trên mảng do các lợi ích bổ sung. Có nói rằng, tôi không biết làm thế nào để kiểm tra một loại mảng. Có thể ai đó có thể cải thiện giải pháp này. Hi vọng điêu nay co ich!

P.S Có, tôi biết rằng điều này cũng không kiểm tra nguyên thủy.

1

Tôi không hài lòng với bất kỳ câu trả lời nào và câu trả lời đúng không giải thích và bỏ phiếu tiêu cực vì vậy tôi đã tìm kiếm và tìm thấy một số nội dung và chỉnh sửa để dễ hiểu. Có một trò chơi với nó, không phải là thẳng về phía trước như người ta sẽ hy vọng.

//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); 

Đây là một phương pháp:

public static void checkClass (Object obj) { 
    Class cls = obj.getClass(); 
    System.out.println("The type of the object is: " + cls.getSimpleName());  
} 
Các vấn đề liên quan