Tôi đã thử nghiệm một số thứ với các tham số bị chặn trong các phương thức chung và tôi đã phát hiện một số hành vi lạ.
Sẽ thật tuyệt nếu có ai đó có thể giải thích hai lỗi trong đoạn mã sau.Các thông số giới hạn Java trong các phương thức chung
Hãy tưởng tượng có hai lớp học Class1
và Class2
cả hai mở rộng từ BaseClass
. Class2
triển khai Giao diện.
Trong Class1
, tôi có một phương pháp mà trả về một thể hiện của Class2
theo cách sau:
public class Class2 extends BaseClass implements Interface {
@Override
public void method() {
System.out.println("test"); //$NON-NLS-1$
}
}
public class Class1 extends BaseClass {
public <T extends BaseClass & Interface> T getTwo() {
return new Class2();
// Error: Type mismatch: cannot convert from Class2 to T
}
public static void main(String[] args) {
Interface two = new Class1().getTwo();
// Error: Bound mismatch: The generic method getTwo() of type Class1 is
// not applicable for the arguments(). The inferred type Interface is
// not a valid substitute for the bounded parameter <T extends BaseClass
// & Interface>
System.out.println(two);
}
}
Nó có vẻ như lạm dụng thuốc generic. Trên thực tế 'getTwo' phải có kiểu trả về chỉ' Class2', hoặc 'BaseClass', hoặc' Interface'. Nếu 'T' được định nghĩa chỉ cho một phương thức thì không có cách nào để trình biên dịch biết lớp nào chính xác thay thế' T' tại dòng 'new Class1(). GetTwo()'. Sẽ chỉ có thể nếu 'getTwo' có các tham số đầu vào của kiểu này. – DRCB