2015-06-24 18 views

Trả lời

17

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); 
} 
7

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>.

3

newHashSet sẽ luôn trả về kiểu đối số kiểu chung của nó. Vì loại childString 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); 
3

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.

Các vấn đề liên quan