Có một hệ thống phân cấp lớp:Làm cách nào để bắt buộc loại trả về của phương thức chung chung?
String child = null;
Object parent = child;
Làm thế nào để buộc Sets.newHashSet(E...)
để trả về một Set<Object>
trong khi đi String
lập luận?
Có một hệ thống phân cấp lớp:Làm cách nào để bắt buộc loại trả về của phương thức chung chung?
String child = null;
Object parent = child;
Làm thế nào để buộc Sets.newHashSet(E...)
để trả về một Set<Object>
trong khi đi String
lập luận?
Bạn có thể chỉ định kiểu trả về chung với:
Sets.<Object>newHashSet(child);
Có lẽ nó sẽ là OK để bạn có thể trở lại Set<? extends Object>
, sau đó bạn có thể viết nó như một kiểu trả về:
public Set<? extends Object> myMethod() {
return Sets.newHashSet(child);
}
Bạn vượt qua các đối số kiểu một cách rõ ràng để newHashSet
:
Sets.<Object>newHashSet(child);
Nếu đối số kiểu không được thông qua rõ kiểu dữ liệu được suy ra và trong trường hợp này nó suy ra các loại sai, có lẽ String
.
Có vẻ như bạn đang sử dụng Guava's Sets. Chữ ký phương pháp là như sau:
public static <E> HashSet<E> newHashSet()
Như bạn thấy newHashSet()
mất một tham số kiểu E
. Kết quả là HashSet<E>
. E
được phỏng đoán là String
, nhưng bạn đã chỉ định phương thức trả lại Set<Object>
. Giải pháp là để giúp trình biên dịch hoặc nới lỏng hạn chế trong kiểu trả về là Set<? extends Object>
.
newHashSet
sẽ luôn trả về kiểu đối số kiểu chung của nó. Vì loại child
là String
trình biên dịch sẽ suy ra loại chung là String
và hàm sẽ trả về một HashSet<String>
.
Bạn chỉ có thể vượt qua nó một Object
thay vì bằng cách đúc child
một cách rõ ràng để buộc các trình biên dịch để suy ra Object
như kiểu generic thay vì:
Sets.newHashSet((Object) child);
Hoặc bạn có thể buộc kiểu generic và bây giờ là trình biên dịch có thể thấy rằng dàn diễn viên là tầm thường:
Sets.<Object>newHashSet(child);
Trong Java 8, điều này biên dịch tốt; suy luận tính đến loại mục tiêu.
public Set<Object> myMethod() {
return Sets.newHashSet(child);
}
Sử dụng API JDK của:
public Set<Object> myMethod() {
return Collections.singleton(child); // Works too
}
Trong Java 5, 6, 7 suy luận theo yêu cầu này được thực hiện trên các loại lập luận một mình.