2017-09-21 68 views
5

Próbuję generify następujące klasy:.Generifying typu array, takich jak Object [] Klasa

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

} 

wszystko jest w porządku z wyjątkiem 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? */)); 
    } 

Jak mogę rozwiązać ten problem bez przechodzenia Foo[].class w konstruktorze takim, jaki zrobiłem z Foo.class?

Odpowiedz

4

W Javie brakuje obiektów do uzyskania klasy tablicowej bezpośrednio z klasy elementów. Wspólna praca wokół jest uzyskanie klasy z tablicy zerowej długości:

private Class<T> type; 
private Class arrType; 

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

Można teraz przejść arrType metody client.get(...).

+0

Myślałam, że też, ale wtedy pomysł ostrzega mnie i mówi: 'Nieograniczony obsada: ...'. Czy istnieje również obejście tego problemu? –

+0

@ s.alem Czy ostrzeże Cię w momencie wywołania 'client.get' lub w miejscu ustawienia' arrType' w konstruktorze? – dasblinkenlight

+0

Niestety, dzieje się tak, gdy ustawiam 'Class ' dla 'arrType'. Kiedy określam to jako "Klasa", nie narzeka tam. Jednak jest to powiedzenie 'Niezaznaczone przypisanie: ...' w wywołaniu metody 'client.get (arrType)'. Mogę z tym żyć, ale byłoby fajnie, gdyby było obejście. –

1

Dlaczego nie można zrobić coś takiego:

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

Prawdopodobnie nie jest to widoczne w tym uproszczonym przykładzie, ale klient jest obecnie poza moim zasięgiem (strona trzecia). Tak więc należy to zrobić w warstwie usług. Więc w moim przypadku zawijanie klienta inną klasą przenosi ten sam problem na inną warstwę. Ale i tak dziękuję. –

+1

Cieszę się, że znalazłeś poprawną odpowiedź :) Pozdrawiam – Bender