Tôi có một lớp đại diện cho một cặp hai giá trị cùng loại (loại mà có thể là bất kỳ một tập hợp cụ thể của các loại):Giới hạn Java Generics hoặc sử dụng sai?
public class Pair<E extends AClass>{
private E var1;
private E var2;
}
Lớp này được sử dụng bởi một khuôn khổ, vì vậy nó cần một không constructor -argument trong đó tôi phải nhanh chóng 2 biến (var1, var2):
public class Pair<E extends AClass>{
private E var1;
private E var2;
public Pair(){
var1 = invoke constructor of type E;
var2 = invoke constructor of type E
}
}
rõ ràng có một số vấn đề ở đây:
trong để khởi tạo các biến tôi bằng cách nào đó nên biết chính xác kiểu của nó và gọi ra hàm tạo của kiểu cụ thể đó; trong trường hợp tốt nhất điều này có nghĩa có một tuyên bố khá lớn nếu khác trong xây dựng, một cái gì đó như:
public Pair(){ if(var1 instanceof SpecificType1){ var1 = new SpecificType1(); var2 = new SpecificType2(); } }
Thậm chí nếu tôi làm như trên, tôi sẽ có một số vấn đề vì var1 được khai báo kiểu E và tôi sẽ gặp lỗi không khớp kiểu khi cố gắng khởi tạo SpecficType1 và gán đối tượng kết quả cho var1/var2. Để làm cho nó hoạt động, tôi phải quăng vào E:
var1 = (E)new SpecificType1();
Nhưng điều này phá hủy các loại thời gian biên dịch kiểm tra như tôi đang cố gắng để đúc một loại hình cụ thể để một kiểu generic.
Đây có phải là hạn chế của Generics trong java hay là kịch bản này là một trường hợp xấu cho việc sử dụng Generics?
Nếu bạn phải sử dụng 'instanceOf' bên trong thùng chứa chung thì bạn gặp vấn đề về thiết kế. –
Bạn có thể thử [Class.forName()] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#forName%28java.lang.String%29) –
Thông báo cho người hỏi (vì chỉnh sửa không thông báo cho người hỏi): Tôi đã thêm một mẫu mã đơn giản cách sử dụng mẫu thiết kế nhà máy trong trường hợp của bạn – amit