Hãy lấy một ví dụ để làm cho nó dễ dàng hơn. Tôi xây dựng một danh sách mà nhà xây dựng có một số integer
và một số List<Integer>
. Danh sách của tôi sẽ chứa tất cả các phần tử của danh sách đã cho nhân với integer
. danh sách của tôi không lưu trữ các yếu tố mới nhưng tính họ một cách nhanh chóng:Cách trả lại một đối tượng có nhiều loại
class MyList extends AbstractList<Integer> implements RandomAccess {
private final int multiplier;
private final List<Integer> list;
public MyList(int multiplier, List<Integer> list) {
this.multiplier = multiplier;
this.list = list;
}
@Override
public Integer get(int index) {
return list.get(index) * multiplier;
}
@Override
public int size() {
return list.size();
}
}
Sau đó, chúng ta có thể gọi new MyList(3, list)
với list = [0, 1, 2, 3]
để có được [0, 3, 6, 9]
.
Tôi muốn giới hạn nhà phát triển cung cấp cho nhà xây dựng MyList
danh sách cũng là RandomAccess
, để chắc chắn anh ấy sẽ không hủy hoại buổi biểu diễn.
Tôi cố gắng để thay đổi các nhà xây dựng với:
public <E extends List<Integer> & RandomAccess> MyList(int multiplier, E list)
MyList
không phải là vấn đề nhưng bây giờ chúng ta không thể gọi các nhà xây dựng mà không sử dụng một thực hiện của cả hai List<Integer>
và RandomAccess
như ArrayList<Integer>
. Vì vậy, một người có danh sách này: List<Integer> list = new ArrayList<>();
không thể làm new MyList(3, list);
(Vì nó được khai báo với List<Integer>
thay vì ArrayList<Integer>
).
Các giải pháp khác mà tôi có là một trong những điều này:
public MyList(int multiplier, List<Integer> list) {
if(!(list instanceof RandomAccess)) {
// Do something like log or throw exception
}
this.multiplier = multiplier;
this.list = list;
}
Nhưng bây giờ tôi không thể kiểm tra tại thời gian biên dịch nếu danh sách thực hiện RandomAccess
, và tôi cần phải sử dụng instanceof
và tôi ghét làm điều này.
Tôi chắc rằng có một cách tốt hơn nhưng nó là gì?
Hãy thử sử dụng | (hoặc toán tử) thay vì & (và toán tử). Tôi không chắc chắn nếu điều này sẽ làm việc, nhưng nó có giá trị một thử. – MLavrentyev
Vì vậy, nếu bạn muốn giới hạn nhà phát triển thành 'RandomAccess' _" để chắc chắn anh ta sẽ không làm hỏng hiệu suất "_, thì tại sao bạn vẫn muốn cho phép họ gọi hàm tạo của bạn với' List', rõ ràng là không thực hiện 'RandomAccess'? Đây có phải là lý do thẩm mỹ không? –
Tôi cần phải gọi 'List.get()'. – Happy