Bạn có thể:
loại bỏ các tham số <T>
loại từ TSTNode
(ví dụ, làm cho nó không chung chung) - nó sẽ vẫn có quyền truy cập vào bên ngoài <T>
.
đổi tên thông số loại <T>
trong lớp TSTNode
thành (nói) U
.
[UPDATE]
Dưới đây là bốn cách khác nhau để viết lại mã của bạn. Tất cả đều biên dịch. Tôi nghĩ bạn nên cân nhắc việc sử dụng một số EnumMap
(xem Phiên bản 4 bên dưới).
Phiên bản 1: sử dụng thông số loại có tên khác biệt trong lớp bên trong. bạn cần sử dụng Danh sách thay vì mảng.
public class TernarySearchTree<T> {
protected class TSTNode<U> {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected List<TSTNode<U>> relatives;
private U data;
protected TSTNode(char splitchar, TSTNode<U> parent) {
this.splitchar = splitchar;
relatives = new ArrayList<TSTNode<U>>();
for (int i = 0; i < HIKID; ++i) { // Allocate 4 slots in relatives
relatives.add(null);
}
relatives.set(PARENT, parent);
}
}
private TSTNode<T> node; // When you use it, pass T as U
public TernarySearchTree() {
node = new TSTNode<T>(',', null); // When you use it, pass T as U
}
}
Phiên bản 2: kế thừa T từ kèm theo lớp
public class TernarySearchTree<T> {
protected class TSTNode {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected List<TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
relatives = new ArrayList<TSTNode>();
for (int i = 0; i < HIKID; ++i) { // Allocate 4 slots in relatives
relatives.add(null);
}
relatives.set(PARENT, parent);
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
Phiên bản 3: sử dụng một bản đồ (thay vì một danh sách)
public class TernarySearchTree<T> {
protected class TSTNode {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected Map<Integer, TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
// Create a hash map. No need to pre-allocate!
relatives = new HashMap<Integer, TSTNode>();
relatives.put(PARENT, parent); // set -> put
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
}
Version 4: xác định các chỉ mục dưới dạng enum + sử dụng EnunMap (thay vì một băm ma p)
public class TernarySearchTree<T> {
protected static enum Index {
PARENT, LOKID, EQKID, HIKID;
}
protected class TSTNode {
protected char splitchar;
protected EnumMap<Index, TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
// Create an EnumMap.
relatives = new EnumMap<Index, TSTNode>(Index.class);
relatives.put(Index.PARENT, parent);
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
[Cập nhật 2] Một điều cần lưu ý: Use EnumMap instead of ordinal indexing
Nếu bạn gặp lỗi biên dịch, bạn nên ** include lỗi biên dịch tin nhắn trong câu hỏi của bạn! Nhưng nó hoạt động tốt cho tôi. Chỉ cần chắc chắn rằng bạn có được thoát khỏi '' trên * tờ khai * của 'người thân' là tốt. Điều đó nói rằng, bạn luôn có thể làm cho 'TSTNode' tĩnh và chỉ sử dụng một tham số khác, như' E'. –
Tại sao không thể tạo mảng chung: http://stackoverflow.com/questions/2927391/whats-the-reason-i-cant-create-generic-array-types-in-java –
TSTNode có cần truy cập không trường mẫu hoặc phương thức từ TernarySearchTree? –