Hãy tưởng tượng chúng ta có lớp chung sau đây:tham số kiểu Unspecified khi gọi phương pháp chung
public class GenericClass<U> {
private U value;
public GenericClass(U value) {
this.value = value;
}
}
và phương pháp chung sau đây trong một số lớp MyClass khác:
public <T extends BT, BT> void genericMethod(T arg) {
Object genericClass = new GenericClass<BT>(arg);
}
Những giá trị sẽ loại tham số BT có được nếu chúng tôi gọi
genericMethod("text");
?
Một số lưu ý:
Đoạn mã trên biên dịch mà không có lỗi hoặc cảnh báo, mà dường như xa lạ đối với tôi. Decompiling (bằng phương tiện của IntelliJ IDEA 2016) cho thấy đoạn mã sau:
public <T extends BT, BT> void genericMethod(T arg) {
new MyClass.GenericClass(arg);
}
ý rằng mới GenericClass<BT>(arg)
là không giống như new GenericClass(arg)
vì sau này là tương đương với new GenericClass<T>(arg)
(loại trừ), và mặc dù T extends BT
, đây là những các loại khác nhau và GenericClass
có thể có logic nội tại, trong đó tên loại chính xác đóng vai trò quan trọng (ví dụ: được sử dụng làm khóa chuỗi trong một số bản đồ, v.v.). Vì vậy, đối với tôi nó là lạ tại sao trình biên dịch âm thầm sử dụng loại khấu trừ thay vì sản xuất một số cảnh báo (hoặc thậm chí có thể lỗi) nói rằng tham số loại BT không được chỉ định. Có lẽ tôi đang mất tích. quan trọng về Generics trong Java, tuy nhiên ...
Cảm ơn bạn đã trả lời. Biến "suy luận" là gì? Bạn có thể chỉ ra điều đó trong mẫu mã của tôi không? Trong khai báo genericMethod() tôi chỉ thấy hai biến * * (T và BT) và một biến thông thường (arg). Tôi đã đọc trong Chương 18.1.1 những điều sau đây: _ "Biến suy luận là siêu biến cho các loại - nghĩa là chúng là các tên đặc biệt cho phép lý luận trừu tượng về các loại. Để phân biệt chúng với các biến kiểu, các biến suy luận được biểu diễn với chữ cái Hy Lạp, chủ yếu là α "_. Tuy nhiên, nó không làm rõ thuật ngữ này cho tôi. –
** Bạn viết: ** _String mở rộng BT Mối quan hệ này cho phép trình biên dịch liên kết BT thành chuỗi, do đó bạn kết thúc cuộc gọi ngụ ý sau: genericMethod ("text") _ - Tôi không thể hiểu tại sao nó cho phép làm điều này: "String extends BT" không giống như "BT == String"! ** Bạn cũng viết: ** _Không thêm nhiều ràng buộc, trình biên dịch sẽ xử lý T tương đương với BT và sẽ cho phép bạn chỉ gọi các phương thức được định nghĩa là một phần của loại BT._ - giống nhau ở đây! Trình biên dịch tốt hơn sẽ tạo ra một lỗi mà BT không được sử dụng ở bất cứ đâu. –
** Bạn viết: ** _The GenericClass hiện tại vì nó là viết tắt không phải là rất hữu ích [...]. Bạn có thể xem xét U trong bối cảnh đó giống như Object._ - Tôi đồng ý: mẫu này là một mẫu quá chưng cất. Trong dự án thực sự của tôi, _JAXBElement_ đứng ở đây (thay cho GenericClass). –