Проксирование с помощью дженериков

Я использую java.lang.reflect.Proxy для проксирования объектов.

У меня есть этот класс:

public class TransportableImpl extends Transportable{
  public class OrderInvoker extends InvocationHandler{
           ...
  }
}

Здесь я создаю прокси:

Transportable t = new TransportableImpl();
Order myOrder = new OrderImpl();
Class proxyClass = Proxy.getProxyClass(getClass().getClassLoader(), Transportable.class, Order.class);
Object serializable = proxyClass.getConstructor(new Class[]{InvocationHandler.class}).newInstance(t.new OrderInvoker(myOrder));

Проблема в том, что класс является необработанным типом и

Class<? extends Order & Transportable> proxyClass =
     (Class<? extends Order & Transportable>) 
     Proxy.getProxyClass(getClass().getClassLoader(), 
     Transportable.class, Order.class);

трудно читать.

Есть идеи?


person Grim    schedule 09.01.2014    source источник
comment
Проблема в том, что это трудно читать?   -  person Sotirios Delimanolis    schedule 09.01.2014
comment
да. А Class<?> точно нет.   -  person Grim    schedule 09.01.2014
comment
Встречный вопрос: что бы вы хотели написать, т.е. что бы вы считали достаточно точным и при этом легко читаемым? Можете ли вы предоставить какой-нибудь псевдокод, который поможет нам понять, к чему вы стремитесь?   -  person Thomas    schedule 09.01.2014
comment
Если речь идет о читаемости, я бы предложил перенести этот вопрос в CodeReview codereview.stackexchange.com.   -  person Raffaele Rossi    schedule 09.01.2014
comment
О, код-ревью что-то новое?   -  person Grim    schedule 09.01.2014
comment
Тот факт, что вы используете необработанный класс, является проблемой только в том случае, если вы планировали использовать аргументы универсального типа, но я не понимаю, как это сделать.   -  person Sotirios Delimanolis    schedule 09.01.2014
comment
Class<? extends Order & Transportable> в любом случае является недопустимым синтаксисом.   -  person Paul Bellora    schedule 09.01.2014


Ответы (1)


Proxy#getProxyClass(ClassLoader, Class) объявлен как

public static Class<?> getProxyClass(ClassLoader loader,
                                     Class<?>... interfaces)

Таким образом, его возвращаемый тип — Class<?>. Нормальный синтаксис будет

Class proxyClass<?> = Proxy.getProxyClass(getClass().getClassLoader(), Transportable.class, Order.class);

Технически вы могли бы сделать (с предупреждением)

public <T extends Order & Transportable> void doSomething() {
    Class<T> proxyClass = (Class<T>) Proxy.getProxyClass(Driver.class.getClassLoader(),
            Transportable.class, Order.class);
}

но это ничего вам не даст, так как вам почти никогда не понадобится использовать эту переменную T. Класс Class предоставляет очень мало методов, которые делают использовать его, а именно getConstructor(Class...) и newInstance(). Но опять же, весь смысл размышлений заключается в том, что вы знаете типы классов только во время выполнения, а не во время компиляции, где полезны дженерики.

person Sotirios Delimanolis    schedule 09.01.2014
comment
Да это оно. Я назвал его PROXY вместо T. - person Grim; 10.01.2014