Bằng cách nào đó câu hỏi cũ của tôi đã được đóng cửa, vì vậy tôi mở một hình mới:Làm thế nào để tránh cảnh báo dàn diễn viên không được kiểm soát với Java Generics
Tôi đang sử dụng Java Generics để thực hiện một generic Hash hai chiều Bản đồ ra khỏi một truy vấn SQL. Nó có thể ánh xạ bất kỳ sự kết hợp nào của các chuỗi String, Integer qua lại. Nó nên được sử dụng như thế này:
String sql = "SELECT string_val, int_val FROM map_table";
PickMap<String, Integer> pm1 = new PickMap<String, Integer>(sql);
String key1 = "seven";
Integer value1 = pm1.getLeft2Right(key1);
Integer key2 = 7;
String value2 = pm1.getRightToLeft(key2);
Dĩ nhiên chúng ta có thể tạo ra một chiều (Integer, Integer) và vân vân ...
thực hiện của tôi về Pick Bản đồ trông như thế này (không có getter ...):
public class PickMap<L, R> {
private final HashMap<L, R> left2Right = new HashMap<L, R>();
private final HashMap<R, L> right2Left = new HashMap<R, L>();
public PickMap(String sql) throws OException {
DTable d = new DTable(sql);
int colTypeL = d.t.getColType(1);
int colTypeR = d.t.getColType(2);
Extractor<L> extLeft = (Extractor<L>) getInstance(colTypeL);
Extractor<R> extRight = (Extractor<R>) getInstance(colTypeR);
int numRows = d.t.getNumRows();
for(int i=1;i<=numRows;i++) {
L leftVal = extLeft.extract(d, i);
R rightVal = extRight.extract(d, i);
this.left2Right.put(leftVal, rightVal);
this.right2Left.put(rightVal, leftVal);
}
}
private Extractor<?> getInstance(int type) {
if(type == 1)
return new IntExtractor();
else
return new StringExtractor();
}
}
interface Extractor<E> {
E extract(DTable source, int row);
}
class IntExtractor implements Extractor<Integer> {
@Override
public Integer extract(DTable source, int row) {
int value = 5;
return new Integer(value);
}
}
class StringExtractor implements Extractor<String> {
@Override
public String extract(DTable source, int row) {
String retVal = "hello";
return retVal;
}
}
Tôi không có lỗi trình biên dịch và tôi chắc chắn rằng nó sẽ hoạt động theo cách này. NHƯNG Tôi nhận được các cảnh báo cast không được kiểm tra trên các phương thức "getInstance" Tôi đưa Extractor (E) vào Extractor (L) ...
Tôi nên truyền như thế nào? Hoặc tôi đang thiếu gì? Hay tôi chỉ nên ngăn chặn những cảnh báo đó?
Có, tôi hiểu ý của bạn. Tôi muốn sử dụng loại L chung cho instanciating Extractor của tôi. Vì vậy, thay vì đưa "colType" vào phương thức getInstance, tôi muốn thực hiện một số thứ như getInstance (L) và getInstance (R) ... Có thể không? Tôi ghét cảnh báo tuyệt vọng! – Sauer
@ Sauer: Bạn phải biết 'L' và' R' tại thời gian thực thi, điều này thường có nghĩa là có các tham số khởi tạo của kiểu 'Class extends L>' và 'Lớp extends R>' hoặc một cái gì đó tương tự. –
Một khả năng là có hàm khởi tạo lấy bộ giải nén mà nó cần: 'PickMap (Chuỗi sql, Extractor extends L> leftExtractor, Extractor extends R> rightExtractor>)'. Điều này không chỉ làm cho việc biên dịch an toàn, nó còn cho phép người khác đến và quyết định họ muốn một 'PickMap' mà không phải thay đổi mã 'PickMap' (giả sử' Extractor' là một giao diện hoặc lớp mà họ có quyền truy cập đến). –
yshavit