Downcasting đôi khi là cần thiết và thích hợp. Đặc biệt, nó thường thích hợp trong trường hợp một người có các đối tượng có thể có hoặc không có khả năng và người ta muốn sử dụng khả năng đó khi nó tồn tại trong khi xử lý các đối tượng mà không có khả năng đó theo cách mặc định. Như một ví dụ đơn giản, giả sử a String
được hỏi liệu nó có bằng một số đối tượng tùy ý khác không. Để một cái String
bằng nhau String
, nó phải kiểm tra độ dài và mảng ký tự lùi của chuỗi khác. Nếu a String
được hỏi liệu nó có bằng a hay không Dog
, tuy nhiên, nó không thể truy cập vào độ dài của Dog
nó, nhưng nó không nên; thay vào đó, nếu đối tượng mà một người String
được cho là so sánh chính nó không phải là mộtString
, so sánh nên sử dụng một hành vi mặc định (báo cáo rằng đối tượng khác không bằng nhau).
Thời điểm khi downcasting nên được coi là đáng ngờ nhất là khi đối tượng được chọn là "được biết" là thuộc loại thích hợp. Nói chung, nếu một đối tượng được biết là a Cat
, người ta nên sử dụng một biến kiểu Cat
, thay vì biến kiểu Animal
, để tham chiếu đến nó. Tuy nhiên, có những lúc điều này không phải lúc nào cũng hoạt động. Ví dụ, một Zoo
bộ sưu tập có thể giữ các cặp đối tượng trong các khe mảng chẵn / lẻ, với mong muốn các đối tượng trong mỗi cặp sẽ có thể tác động lên nhau, ngay cả khi chúng không thể tác động lên các đối tượng trong các cặp khác. Trong trường hợp như vậy, các đối tượng trong mỗi cặp vẫn sẽ phải chấp nhận một loại tham số không cụ thể để chúng có thể, về mặt cú pháp , được truyền các đối tượng từ bất kỳ cặp nào khác. Vì vậy, ngay cả khi Cat
'splayWith(Animal other)
phương thức sẽ chỉ hoạt động khi other
là một Cat
, Zoo
cần phải có thể truyền cho nó một phần tử của một Animal[]
, vì vậy kiểu tham số của nó sẽ phải Animal
thay vì Cat
.
Trong trường hợp downcasting là hợp pháp không thể tránh khỏi, người ta nên sử dụng nó mà không cần điều kiện. Câu hỏi quan trọng là xác định khi nào một cách hợp lý có thể tránh bị hạ thấp và tránh nó khi có thể.