Nếu lớp B
và lớp C
mở rộng lớp A
và tôi có một đối tượng kiểu B
hoặc C
, làm thế nào tôi có thể xác định loại đó là một thể hiện?
Nếu lớp B
và lớp C
mở rộng lớp A
và tôi có một đối tượng kiểu B
hoặc C
, làm thế nào tôi có thể xác định loại đó là một thể hiện?
Câu trả lời:
if (obj instanceof C) {
//your code
}
if(!(obj instanceof C))
code
Child1 child1 = new Child1 (); Parent1 ParentChild = new Child2 (); Child2 child2 = new Child2 (); (child1 dụof Parent1); (child1 dụof Child1); (ParentChild instanceof Child2); (ParentChild dụof Parent1); (ParentChild instanceof Child1); code
, nó có thể xóa ý định của instanceof.
Sử dụng Object.getClass () . Nó trả về kiểu thời gian chạy của đối tượng.
Nhiều câu trả lời đúng đã được trình bày, nhưng vẫn còn nhiều phương pháp khác: Class.isAssignableFrom()
và chỉ đơn giản là cố gắng truyền đối tượng (có thể ném a ClassCastException
).
Chúng ta hãy tóm tắt các cách có thể để kiểm tra nếu một đối tượng obj
là một thể hiện của loại C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
xử lýCó một sự khác biệt trong null
xử lý mặc dù:
false
if ( không phải là ví dụ của bất kỳ thứ gì).obj
null
null
NullPointerException
rõ ràng.null
vì null
có thể được truyền sang bất kỳ loại nào!Để nhớ:
null
không phải là một thể hiện của bất kỳ loại nào nhưng nó có thể được chuyển thành bất kỳ loại nào.
Class.getName()
không nên được sử dụng để thực hiện một becase thử nghiệm "is-instance-of" nếu đối tượng không phải là loại C
mà là một lớp con của nó, nó có thể có một tên và gói hoàn toàn khác (do đó tên lớp rõ ràng sẽ không khớp) nhưng nó là vẫn thuộc loại C
.Class.isAssignableFrom()
không đối xứng : obj.getClass().isAssignableFrom(C.class)
sẽ trả về false
nếu loại obj
là một lớp con của C
.Bạn có thể dùng:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Nhưng tôi nghĩ rằng hầu hết thời gian không nên sử dụng điều đó cho dòng điều khiển hoặc thứ gì đó tương tự ...
Bất kỳ việc sử dụng bất kỳ phương pháp nào được đề xuất đều được coi là mùi mã dựa trên thiết kế OO xấu.
Nếu thiết kế của bạn tốt, bạn không nên thấy mình cần sử dụng getClass()
hay instanceof
.
Bất kỳ phương pháp được đề xuất nào cũng sẽ làm, nhưng chỉ cần một cái gì đó để ghi nhớ, thiết kế khôn ngoan.
Chúng ta có thể sử dụng sự phản chiếu trong trường hợp này
objectName.getClass().getName();
Thí dụ:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
Trong trường hợp này, bạn sẽ nhận được tên của lớp mà đối tượng chuyển qua HttpServletRequest
biến giới thiệu giao diện.
obj.getClass()
sẽ trả về className, prefixex bằng từclass
request.getClass().getName();
in tất cả các gói! cùng với tên lớp
Ngoài ra còn có một .isInstance
phương thức trên Class
lớp "". nếu bạn nhận được một lớp của đối tượng thông qua myBanana.getClass()
bạn có thể xem liệu đối tượng của bạn myApple
có phải là một thể hiện của cùng một lớp như myBanana
thông qua không
myBanana.getClass().isInstance(myApple)
kiểm tra với isinstance()
sẽ không đủ nếu bạn muốn biết trong thời gian chạy. sử dụng:
if(someObject.getClass().equals(C.class){
// do something
}
Tôi sử dụng chức năng thổi trong lớp GeneralUtils của mình, kiểm tra xem nó có hữu ích không
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
Tôi đã sử dụng các tổng quát Java 8 để lấy cá thể đối tượng trong thời gian chạy thay vì phải sử dụng trường hợp chuyển đổi
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
vượt qua bất kỳ loại dữ liệu nào và phương thức sẽ in loại dữ liệu bạn đã truyền trong khi gọi nó. ví dụ
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
Sau đây là đầu ra
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []