Có thể bạn đã nghe ngoại suy luật của Postel : "Hãy thận trọng trong những gì bạn gửi, tự do trong những gì bạn chấp nhận."
Chủ yếu là về tối đa hóa khả năng sử dụng lại mã. Thật dễ dàng để đưa ra các trường hợp để chứng minh tại sao nó giúp. Hãy xem xét Java Iterable<T>
như một ví dụ. Nếu điều duy nhất mà phương thức của bạn thực hiện là lặp qua tất cả các T
s, thì có một Iterable<T>
kiểu tham số cho phép bạn sử dụng phương thức đó với hơn 60 lớp dựng sẵn, không đề cập đến bất kỳ lớp tùy chỉnh nào thực hiện giao diện. Nếu bạn giới hạn nó, giả sử, Vector<T>
thì bất kỳ mã nào gọi phương thức của bạn sẽ phải chuyển đổi thành mã Vector<T>
đầu tiên.
Mặt khác, việc trả về một Iterable<T>
từ một phương thức sẽ giới hạn số lượng mã có thể sử dụng giá trị trả về của bạn cho các phương thức lấy Iterable<T>
tham số. Nếu bạn quay trở lại một loại rất cụ thể, như Vector<T>
, sau đó giá trị trả về của bạn có thể được thông qua vào bất kỳ phương pháp mà phải mất một Serializable
, Cloneable
, Iterable<T>
, Collection<T>
, List<T>
, RandomAccess
, Vector<T>
, AbstractList<T>
, hay AbstractCollection<T>
, và nó sẽ làm việc như mong đợi.