2015-01-09 25 views
8

Trong khi sử dụng Spring ApplicationContext và phương thức của nó getBeansOfType Tôi đã gặp sự cố với các kiểu chung. Điều này chứng minh sự cố:Cách chuyển đổi từ Danh sách <SomeParamType> thành Danh sách <SomeParamType <?>>

class Test 
{ 
    List<Generator<?>> allGenerators = 
     new ArrayList(getBeansOfType(Generator.class).values()); // Raw type warning 
                   // for new ArrayList() 
    <T> Map<String, T> getBeansOfType(Class<T> klass) { 
    return emptyMap(); 
    } 
} 

interface Generator<R> {} 

Tôi truy xuất tất cả các loại hạt được tham số hóa từ vùng chứa. Tôi muốn có chúng dưới dạng Generator<?> và sử dụng logic tùy chỉnh để truyền an toàn đến thông số loại thích hợp dựa trên thuộc tính trên mỗi phiên bản Generator.

Vấn đề của tôi là tôi không thể tìm bất kỳ cách nào để gán cho allGenerators mà không có cảnh báo an toàn loại, mặc dù ở mức khái niệm, tôi không cam kết với bất kỳ thông số loại không được kiểm tra nào. Tôi chỉ muốn chuyển đổi một loại thô thành một loại ký tự đại diện.

Có thành ngữ nào không yêu cầu @SuppressWarnings để đến đó không?

Trả lời

3

Không thực sự là một chuyển đổi, nhưng một chương trình xây dựng một danh sách các loại cần thiết mà không cần cảnh báo:

public List<Generator<?>> solution() { 
    List<Generator<?>> dst = new ArrayList<>(); 
    for (Generator<?> g : getBeansOfType(Generator.class).values()) { 
     dst.add(g); 
    } 
    return dst; 
} 
+1

Nhưng điều đó rõ ràng đưa ra cảnh báo "kiểu thô" trên 'Trình tạo g'. Bạn có thể tắt cảnh báo đó trong Eclipse, nhưng đó không phải là những gì tôi đang hướng đến. –

+0

@MarkoTopolnik có vẻ như ok nếu tôi sử dụng 'Máy phát điện ' làm loại 'g' (ít nhất, mã biên dịch và tôi không nhận được bất kỳ cảnh báo nào) – Raffaele

+0

Bạn phải bật -Xlint: bỏ chọn trong cài đặt trình biên dịch trong IntelliJ để xem cảnh báo hoặc biên dịch theo cách thủ công với cài đặt này được bật. –

1

Tôi cho rằng đó là không thể (để chuyển đổi một loại nguyên liệu đến một một với một tham số ký tự đại diện).

Nguyên nhân là do các generic loại (và đặc biệt là các ký tự đại diện) là một cái gì đó khác biệt so với một loại lớp và không thể được đại diện với các công cụ của các loại lớp.

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