xem xét không làm K
một chung, nhưng sử dụng một giao diện mà kết thúc tốt đẹp các wrapper nguyên thủy (một wrapper đôi!).
import java.util.HashMap;
public class NodeWrapper<K extends Comparable<K>> implements Comparable<NodeWrapper<K>> {
private static HashMap<Class, NodeWrapper> minVals = new HashMap<Class, NodeWrapper>();
private K value;
private NodeWrapper() {
super();
}
public NodeWrapper(K value, Class<K> clazz) {
super();
this.value = value;
if (minVals.get(clazz)==null) {
minVals.put(clazz, new NodeWrapper<K>());
}
}
public K getValue() {
return value;
}
public static NodeWrapper getMinValue(Class clazz){
return minVals.get(clazz);
}
public void setValue(K value) {
this.value = value;
}
@Override
public int compareTo(NodeWrapper<K> o) {
NodeWrapper min = minVals.get(this.getClass());
if (this==min && o==min) {
return 0;
} else if (this==min){
return -1;
} else if (o==min){
return 1;
} else {
return this.value.compareTo(o.value);
}
}
}
Tóm lại, ý tưởng là bất cứ khi nào một lớp mới được khởi tạo, giá trị tối thiểu được tạo và đưa vào băm tĩnh lưu trữ giá trị tối thiểu cho mỗi lớp. (Thực tế, những giá trị này KHÔNG có gì cả, chỉ là một đối tượng sentinel, nhưng vì chúng ta sẽ sử dụng đối tượng bình đẳng để xác định xem cái gì là giá trị min, điều này không có vấn đề gì cả.) Tất cả những gì cần thiết là đối tượng được so sánh có thể so sánh được cho các trường hợp khác của chính nó nói chung.
Một nhược điểm là khi bạn gọi getMinValue
bạn sẽ có cảnh báo trình biên dịch vì loại trả về sẽ không có thông tin chung. Có thể có một cách thanh lịch hơn xung quanh điều này, nhưng tôi không thể nghĩ về nó ngay bây giờ.
Ý tưởng chung này có thể khá tốt đẹp. Tuy nhiên, tôi nên thực sự căng thẳng: điều này sẽ hoàn toàn phá vỡ nếu bạn thử nó với bất kỳ đa hình hoặc bất kỳ pha trộn của các lớp học cùng có thể so sánh. Long
s và Integer
s trong cùng một cây sẽ phá hủy hoàn toàn bạn.
Nguồn
2009-04-29 20:08:28
Bạn có thể cung cấp một số mã mẫu minh họa cách bạn muốn sử dụng K không? –
Bạn có thể xây dựng một chút không? Một số mã có liên quan sẽ tốt đẹp. –
Ngẫu nhiên, các phiên bản đối tượng của các chữ số đều mở rộng java.lang.Number. Thật không may, số không có bất cứ điều gì như getMaximumValue(). – Powerlord