2017-09-21 14 views
5

Tôi cố gắng để generify lớp sau:.Generifying mảng kiểu như Object [] lớp

public class FooService { 

    private Client client; 

    public Foo get(Long id) { 
    return client.get(id, Foo.class); 
    } 

    public List<Foo> query() { 
    return Arrays.asList(client.get(Foo[].class)); 
    } 

} 

Mọi thứ đều ổn trừ Foo[].class:

public abstract class BaseService<T, I> { 

    private Client client; 
    private Class<T> type; 

    public BaseService(Class<T> type) { 
    this.type = type; 
    } 

    public T get(I id) { 
    return client.get(id, type); 
    } 

    public List<T> query() { 
    return Arrays.asList(client.get(/* What to pass here? */)); 
    } 

Làm thế nào tôi có thể giải quyết vấn đề này mà không đi Foo[].class trong constructor như tôi đã làm với Foo.class?

Trả lời

4

Java thiếu cơ sở để có được một lớp mảng từ lớp phần tử trực tiếp. Một chung công việc xung quanh là để có được lớp từ một mảng zero-length:

private Class<T> type; 
private Class arrType; 

public BaseService(Class<T> type) { 
    this.type = type; 
    arrType = Array.newInstance(type, 0).getClass(); 
} 

Bây giờ bạn có thể vượt qua arrType với phương pháp client.get(...).

+0

Tôi nghĩ điều đó quá, nhưng sau đó ý tưởng cảnh báo cho tôi và nói 'không được kiểm soát dàn diễn viên: ... '. Có cách giải quyết nào cho vấn đề này không? –

+0

@ s.alem Liệu nó có cảnh báo bạn tại điểm gọi 'client.get' hoặc tại điểm thiết lập' arrType' trong hàm dựng không? – dasblinkenlight

+0

Xin lỗi, điều đó xảy ra khi tôi đặt 'Lớp ' cho 'arrType'. Khi tôi định nghĩa nó là 'Lớp', nó không phàn nàn ở đó. Tuy nhiên, nó được gọi là 'Unchecked assignment: ...' trong phương thức gọi là 'client.get (arrType)'. Tôi có thể sống với điều đó, nhưng sẽ rất tuyệt nếu có cách giải quyết khác. –

1

Tại sao bạn không làm điều gì đó như thế này:

public class Client<T> { 

    T instance; 

    T get(long id) { 
     return instance; 
    } 

    List<T> get(){ 
     return new ArrayList<>(); 
    } 
} 

class FooService<T> { 

    private Client<T> client; 

    public T get(Long id) { 
     return client.get(id); 
    } 

    public List<T> query() { 
     return client.get(); 
    } 

} 
+0

Có thể không hiển thị trong ví dụ đơn giản này, nhưng khách hàng thực sự nằm ngoài tầm với của tôi (bên thứ 3). Vì vậy, điều này đã được xử lý trong lớp dịch vụ. Vì vậy, trong trường hợp của tôi gói khách hàng với một lớp khác chỉ di chuyển cùng một vấn đề cho một lớp khác. Nhưng cảm ơn bạn anyway. –

+1

Tôi rất vui vì bạn đã tìm được câu trả lời đúng :) Kính trọng – Bender

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