Làm thế nào để kiểm tra loại biến trong Java?


120

Làm cách nào tôi có thể kiểm tra để đảm bảo rằng biến của tôi là int, array, double, v.v.?

Chỉnh sửa: Ví dụ: làm cách nào để kiểm tra xem một 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?



Câu hỏi rất liên quan có câu trả lời ở đây: stackoverflow.com/questions/2674554/… .
A.Alessio

Câu trả lời:


111

Java là một ngôn ngữ được định kiểu tĩnh, vì vậy 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 biến đó chỉ được gán các giá trị của kiểu đó (hoặc các giá trị là kiểu con của kiểu đó).

Các ví dụ bạn đã đưa ra ( int, mảng, double) đây đều là các ví dụ nguyên thủy và không có kiểu con nào của chúng. Do đó, nếu bạn khai báo một biến là int:

int x;

Bạn có thể chắc chắn rằng nó sẽ chỉ giữ intgiá trị.

ListTuy nhiên, nếu bạn đã khai báo một biến là a , thì có thể biến đó sẽ chứa các kiểu con của List. Ví dụ về các bao gồm ArrayList, LinkedListvv

Nếu bạn đã có một Listbiến và bạn cần biết nó có phải là một biến hay không 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 nghĩ rằng bạn cần phải làm điều đó, bạn có thể muốn suy nghĩ lại cách tiếp cận của mình. Trong hầu hết các trường hợp, nếu bạn tuân theo nguyên tắc hướng đối tượng, bạn sẽ không cần phải làm điều này. Tất nhiên, có những ngoại lệ cho mọi quy tắc.


3
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 như được yêu cầu ban đầu.
GrantRobertson,

38

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

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

sau đó:

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

21
Không phải là một phương pháp tốt IMO. Điều gì xảy ra nếu tôi chuyển một số kiểu tùy ý không được xác định trong lớp Typetester của bạn - ví dụ như trong trường hợp này là String?
Tash Pemhiwa

6
@TashPemhiwa sau đó 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à tài sản tốt nhất của lập trình viên.
Kato

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

3
Việc lựa chọn chữ ký nào xảy ra tại thời điểm biên dịch, không phải thời gian chạy. Vì vậy, kỹ thuật này sẽ không cho bạn biết bất cứ điều gì bạn chưa biết tại thời điểm biên dịch. docs.oracle.com/javase/specs/jls/se7/html/…
jmh

26

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

boolean b = a instanceof String- sẽ cho bạn biết đối tượng thực được tham chiếu có phải alà một thể hiệ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được khai báo ban đầu hoặc sau đó được ép kiểu không liên quan đến kết quả của toán tử instanceof.

Tôi lấy thông tin này từ: Làm thế nào để bạn biết một kiểu biến trong java?

Điều này có thể xảy ra. Tôi đang cố gắng phân tích cú pháp a Stringthành một int và tôi muốn biết liệu của tôi Integer.parseInt(s.substring(a, b))đang loại bỏ một int hay 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à Reflection. Dưới đây là một số thông tin thêm về chủ đề này: http://docs.oracle.com/javase/tutorial/reflect/


14

Bạn có thể làm việc với Integer thay vì int, Double thay vì double, v.v. (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 instanceof của toán tử, nhưif(var instanceof Integer){...}


2
Tất cả những gì chúng ta cần là một ca sử dụng hợp lệ.
Marquis of Lorne,

Nghe có vẻ như là cách tiếp cận hiệu quả nhất.
I.Tyger

13

Chỉ dùng:

.getClass().getSimpleName();

Thí dụ:

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

Đầu ra:

StringBuilder

1
Tôi đề nghị lưu ý rằng điều này không hoạt động nếu randSBgiữ NULL.
Basil Bourque

8

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

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


6

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

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


5
Tôi có thể có một bản đồ băm từ chuỗi sang đối tượng, đặt một số int vào bản đồ băm đó và kéo nó ra. Chỉ có điều tôi biết rằng đó là một "đối tượng" và có thể phải kiểm tra xem nó thuộc loại nào. Không nói là tốt, chỉ nói là có thể.
matty-d,

5

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


2

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

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

1

Không có câu trả lời nào trong số những câu trả lời này hoạt động nếu biến là loại chung chưa được khởi tạo

Và từ những gì tôi có thể tìm thấy, chỉ có thể bằng cách sử dụng một cách giải quyết cực kỳ xấu xí hoặc bằng cách chuyển một tham số đã khởi tạo vào hàm của bạn, làm cho nó đúng vị trí, xem tại đây:

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

KHÔNG hợp lệ vì bạn không thể kéo Ttrực tiếp loại ra khỏi tham số, vì nó sẽ bị xóa trong thời gian chạy.

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

Điều này hoạt động vì người gọi có trách nhiệm khởi tạo biến outtrước khi gọi. Điều này vẫn sẽ ném ra một ngoại lệ nếu out là null khi được gọi, nhưng so với giải pháp được liên kết, đây là cách dễ nhất để thực hiện điều này

Tôi biết đây là một loại ứng dụng cụ thể, nhưng vì đây là kết quả đầu tiên trên google để tìm loại biến với java (và cho rằng đó Tlà một loại biến), tôi cảm thấy nó nên được đưa vào


0

Bạn có thể kiểm tra nó dễ dàng bằng cách sử dụng Java.lang.Class.getSimpleName() Method Only nếu biến có kiểu không nguyên thủy. Nó không hoạt động với các kiểu nguyên thủy int, long, v.v.

tham khảo - Đây là liên kết tài liệu Oracle


0

Về cơ bản, Ví dụ:

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
    }

}

1
Một gợi ý nhỏ: Khi có một câu hỏi đó là 10 tuổi và có> 10 câu trả lời trong đó một số có> 100 upvotes, sau đó nó là (không thể nhưng) rất , rất không chắc rằng câu trả lời mới có thể thêm một cái gì đó hữu ích (đặc biệt, khi nó chỉ là một đoạn mã có nội dung "Đây, xem này, cái này in ra thứ gì đó" ...)
Marco13

-4

Lớp công khai 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());

}

}

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.