Tôi có một giao diện java như thế nàyBounded Loại thông số đúc vấn đề
public interface MyInterface<T> {
public <V extends T> V get(String key, Bundle bundle);
}
xin lưu ý các thông số <V extends T>
loại phương pháp.
Sau đó, tôi có một lớp MyFoo implements MyInterface
class MyFoo implements MyInterface<Object> { // Object because can be any type
@Override public <V> V get(String key, Bundle bundle) {
return new Other();
}
}
Vì vậy, khi bây giờ tôi có một lớp học như thế này:
class Bar {
public Other other;
public Other setOther(Other other);
}
Sau đó, tôi muốn đi MyFoo
thiết Other
trong một trường hợp Bar
:
MyFoo foo = new MyFoo();
Bar bar = new Bar();
bar.other = foo.get();
Điều này hoạt động hoàn hảo. Loại có thể được xác định bởi Generics java. Không cần thêm diễn viên.
Tuy nhiên, nếu tôi muốn sử dụng bar.setOther()
sau đó loại có thể không được xác định:
MyFoo foo = new MyFoo();
Bar bar = new Bar();
bar.setOther(foo.get()); // Fails
Sau đó, tôi nhận được lỗi biên dịch sau:
error: incompatible types: Object cannot be converted to Other
Tôi không hiểu tại sao doesn này không hoạt động cho phương thức bar.setOther(foo.get())
nhưng hoạt động khi truy cập trực tiếp vào trường bar.other = foo.get()
Bất kỳ ý tưởng nào để giải quyết điều đó mà không cần addin g một dàn diễn viên phụ như bar.setOther((Other) foo.get())
Vâng, đó là một loại giải pháp thay thế. Vì vậy, trình biên dịch không thể nhìn vào tham số kiểu của 'setOther()'? Âm thanh lạ ... – sockeqwe
@ dasblinkenlight Tôi sẽ đào phần JLS nhưng tôi đoán nó phải làm với thực tế là một phương pháp có thể bị quá tải cho nhiều loại tham số và JLS không muốn cho phép quá trình lựa chọn quá tải và lựa chọn loại bê tông cho các loại chung ảnh hưởng lẫn nhau. –
phương pháp quá tải ... âm thanh hợp lý – sockeqwe