Xem xét giao diện UnaryFunction
được xác định trong Hiệu quả Java chương generics.Tại sao an toàn để ngăn chặn cảnh báo không được kiểm soát này?
public interface UnaryFunction<T> {
T apply(T arg);
}
và đoạn mã sau để trả lại UnaryFunction
// Generic singleton factory pattern
private static UnaryFunction<Object> IDENTITY_FUNCTION = new UnaryFunction<Object>() {
public Object apply(Object arg) { return arg; }
};
// IDENTITY_FUNCTION is stateless and its type parameter is
// unbounded so it's safe to share one instance across all types.
@SuppressWarnings("unchecked")
public static <T> UnaryFunction<T> identityFunction() {
return (UnaryFunction<T>) IDENTITY_FUNCTION;
}
Tại sao là diễn viên của IDENTITY_FUNCTION
để (UnaryFunction<T>)
an toàn không?
Quyển sách nói về câu hỏi tôi đang hỏi nhưng tôi không thể theo logic ở đây. Chúng ta đang gọi hàm apply
hoạt động nhận dạng ở đâu? tôi bối rối bởi vì đó là hàm trả về cùng một đối tượng được truyền vào nó mà không sửa đổi bất cứ thứ gì.
Dàn diễn viên của IDENTITY_FUNCTION để
(UnaryFunction<T>)
tạo ra một cảnh báo kiểm soát dàn diễn viên, nhưUnaryFunction<Object>
không phải là mộtUnaryFunction<T>
cho mỗiT
. Nhưng chức năng nhận dạng là đặc biệt: nó trả về đối số của nó chưa sửa đổi, vì vậy chúng tôi biết rằng nó là an toàn để sử dụng nó như là mộtUnaryFunction<T>
bất kể giá trị củaT
. Do đó, chúng tôi có thể tự tin chặn cảnh báo truyền không được chọn được tạo bởi lần truyền này. Khi chúng tôi đã thực hiện việc này, mã sẽ biên dịch không có lỗi hoặc cảnh báo .
Câu hỏi phụ: bạn đang sử dụng sách nào và nó nói điểm của mã này là gì? – asteri
@Jeff Hiệu quả java là tên sách và nó có trong chương generics, đặc biệt trong phần mô tả các chức năng chung. – Geek