2012-04-04 32 views
39

Tôi nhận được cảnh báo trong nhật thực (phiên bản mới nhất) cho mã sau đây.Khắc phục sự cố "Thông số kiểu T đang ẩn cảnh báo T"

public interface A<T> extends B<T> { 
    public T getObject(); 
} 

Cảnh báo xuất hiện tại 'T' trong 'A' và đọc: "Thông số loại T đang ẩn loại T".

Phần lạ là mã sau không tạo ra lỗi hoặc cảnh báo.

public interface A extends B<T> { 
    public T getObject(); 
} 

Nhưng bây giờ tôi không thể mở rộng A trong khi cho biết loại T là gì.

Tôi hoàn toàn bối rối. Có ai biết tại sao chuyện này xảy ra không? Cảm ơn bạn.

+6

Trong trường hợp của tôi, Eclipse đã tự động nhập 'org.apache.poi.ss.formula.functions.T', điều này đã gây ra cảnh báo. –

Trả lời

45

Bạn có nơi nào đó có lớp hoặc giao diện có tên T hoặc bạn đang sử dụng T làm tên loại bê tông ở đâu đó thay vì tham số kiểu (có nghĩa là bạn có thể đã quên một nơi khác, ví dụ như trong một lớp học kèm theo) chỉ định rằng T là thông số loại)? Tôi có thể tái tạo vấn đề của bạn với điều này:

class T { // A concrete type T 
} 

interface B<T> { // warning: The type parameter T is hiding the type T 
} 

interface A<T> extends B<T> { // warning: The type parameter T is hiding the type T 
    T getObject(); 
} 

Nếu tôi xóa lớp T, nó biến mất.

+2

Đó là nó, cảm ơn bạn! Hóa ra tôi vô tình nhập một lớp có cùng tên với tham số kiểu. Tôi đã nhập khẩu và nó hoạt động tốt. – nikdeapen

+12

Điều này cũng xảy ra rõ ràng khi một lớp chung bên trong sử dụng lại cùng tham số Kiểu như lớp kèm theo (cũng chung chung). – mgaert

2

tôi cố gắng:

public interface B<T> { 
    T getObject(); 

    public interface A<T> extends B<T>{ 
     T getObject(); 
    } 
} 

về nhật thực Indigo Service Release 2 và không có cảnh báo hoặc lỗi

2

Mặc dù câu hỏi này đã được trả lời, vì dòng chủ đề là về ("Các tham số kiểu T đang ẩn kiểu T "), chỉ muốn thêm rằng cảnh báo này không phải lúc nào cũng có nghĩa là có một lớp hoặc kiểu thực" T "được khai báo ở đâu đó trong classpath (hoặc lớp bên trong) như tất cả các câu trả lời/bình luận gợi ý.

xem xét như sau:

public class Cache<K extends Comparable<K>,V> { 

    private final ConcurrentHashMap<K,V> _concurrentMap = new ConcurrentHashMap<K,V>(); 

    public <K,V> void add(K key ,V value){ // Compiler warning - The type parameter V is hiding type V (as also for K) 

    _concurrentMap.put(key, value); //Compiler error - K and V passed to add are now being considered different 
            //from whats declared for _concurrentMap variable 
    } 

    public V get(K key){ 
    return _concurrentMap.get(key); 
    } 

    public int size(){ 
    return _concurrentMap.size(); 
    } 
} 

Bởi vì K, V được khai báo ở cấp lớp, phương pháp này cũng thêm "thừa hưởng" nó. Vì vậy, bạn sẽ nhận được cảnh báo tương tự.

Dưới loại bỏ các lỗi cảnh báo và biên dịch tất nhiên

public <E,F> void add(K key ,V value){ 
    _concurrentMap.put(key, value); 
} 

Và phương pháp ban đầu của tôi là thế này.(Không yêu cầu kiểu generic bổ sung cho phương pháp của tôi)

public void add(K key ,V value){ 
    _concurrentMap.put(key, value); 
} 
2

Chỉ cần để mở rộng câu trả lời cuối cùng (Tôi biết câu hỏi là cũ và đóng), tôi sẽ cung cấp một trường hợp đơn giản nhất mà bạn có thể hiểu được lỗi:

Hãy tưởng tượng một giao diện với một phương pháp chung chung như:

<T> Output<T> doSomething(Input<T> input); 

Nếu bạn cố gắng để ghi đè lên nó như:

@Override 
public <Object> Output<Object> soSomething(Input<Object> input){ 
    /*..*/ 
} 
.210

Trình biên dịch cảnh báo bạn:

The type parameter Object is hiding the type Object

gì nó có nghĩa là "đối tượng" là một nhãn chung chung ở đây, nó không phải là java.lang.Object. Nếu bạn thay đổi kiểu đối tượng thành V hoặc bất kỳ ký tự tùy ý nào, điều đó sẽ không xảy ra. Nhưng bạn đang sử dụng và appelative mà va chạm với một lớp xác định thực tế, do đó, trình biên dịch cảnh báo bạn rằng đối tượng này của bạn đang ẩn những gì nếu không sẽ được hiểu là lớp Object chung.

+1

Vì thứ tự hiển thị câu trả lời không cố định, "câu trả lời cuối cùng" không thực sự xác định câu trả lời của bạn. –

+0

Cái của Plaiska tôi muốn nói – Whimusical

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