Как получить литерал Класса от в общем определенного Класса

Существуют методы как они, которые требуют литералов Класса как аргумента.

Collection<EmpInfo> emps =  
  SomeSqlUtil.select(  
  EmpInfo.class,  
  "select * from emps");

или

GWT.create(Razmataz.class);

Проблема представляет себя, когда я должен предоставить универсальные определенные классы как

EmpInfo<String>
Razmataz<Integer>

Следующее было бы неправильным синтаксисом

Collection<EmpInfo<String>> emps =  
  SomeSqlUtil.select(  
  EmpInfo<String>.class,  
  "select * from emps");

или

GWT.create(Razmataz<Integer>.class);

Поскольку Вы не можете сделать синтаксиса как

Razmataz<Integer>.class

Так, как я смог бы сжать литерал класса из

EmpInfo<String>
Razmataz<Integer>

так, чтобы я мог подать их как аргументы методам, требующим литералов Класса?

Дальнейшая информация

Хорошо, я признаюсь, что прошу у этого, прежде всего, GWT.

У меня есть пара интерфейса GWT RPC Razmataz. (К вашему сведению интерфейс GWT RPC должен быть определен в парах клиента сервера). Я планирую использовать ту же интерфейсную пару для передачи ли это быть Строкой, Целым числом, булевской переменной, и т.д.

GWT.create(Razmataz) для Razmataz<T> жалуется, что, так как я не указывал T, компилятор GWT рассматривал его как Объект. Затем компилятор GWT не принял бы Класс объекта. Это должно быть более конкретно, чем быть Объектом.

Так, кажется, что нет никакого способа для меня сказать GWT.create, что - T то, потому что литерал Класса является понятием среды выполнения, в то время как дженерики являются понятием времени компиляции, правильно?

9
задан Blessed Geek 19 May 2010 в 09:28
поделиться

3 ответа

Кто-то оставил здесь короткий, но лаконичный ответ, который я собирался выбрать в качестве ответа. К сожалению, этот человек удалил этот ответ. Если бы этот человек был так любезен, чтобы повторно опубликовать этот ответ, я выберу его. А пока позвольте мне изложить этот ответ и то, как я его использовал.

Это то, о чем я должен был подумать ,


Interface RazmatazString extends Razmataz<String>{}

GWT.create(RazmatazString.class);

Основываясь на ответе, который был удален,

у меня была бы базовая пара интерфейсов Razmataz, которая выполняет множество вещей, которые я слишком ленив, чтобы повторить.

Abstract class Razmatazer{
.....

  Interface Razmataz<T>{
  // does a lot of RPC stuffs
  }

  Interface RazmatazAsync<T>{
  // does a lot of RPC stuffs
  }

  RazmatazAsync<?> razmatazAsyncRPC;
}

Идея заключается не в создании экземпляра дескриптора razmatazAsyncRPC в базовом классе, а в производном классе.

Для T = String

StringRazmatazer extends Razmatazer{

  Interface RazmatazStringAsync extends RazmatazAsync<String>{}
  Interface RazmatazString extends Razmataz<String>{}

  razmatazAsyncRPC = GWT.create(RazmatazString.class);
}

В противном случае мне пришлось бы повторить ~ 100 строк кода, ~ 50 каждая для Razmataz и RazmatazAsync, с различными T параметрическими значениями String, Map, Boolean, Integer и т. Д.

основная предпосылка для преодоления этого препятствия была - мне лень повторять эти строки.

3
ответ дан 4 December 2019 в 15:12
поделиться

Вы не можете.

Используйте небезопасное приведение:

Collection<EmpInfo<String>> emps = 
     (Collection<EmpInfo<String>>) someMethod(EmpInfo.class);
3
ответ дан 4 December 2019 в 15:12
поделиться

Цитата из Java Generics and Collections , раздел 7.2:

Литералы классов также ограничены; даже синтаксически недопустимо указывать параметр типа для типа в литерале класса. Таким образом, следующий фрагмент является недопустимым:

class ClassLiteral {
  public Class<?> k = List<Integer>.class;  // syntax error
}

Действительно, грамматика Java делает фразу, такую ​​как предыдущая, трудной для синтаксического анализа, и это может вызвать каскад синтаксических ошибок [...]

Эта синтаксическая проблема приводит к неравномерность. Везде, где требуется реализуемый тип, вы можете предоставить либо необработанный тип (например, List ), либо параметризованный тип с неограниченными подстановочными знаками (например, List ). Однако для токенов класса необходимо указать необработанный тип; не могут появляться даже неограниченные подстановочные знаки. Замена List на List в предыдущем коде приводит к аналогичному каскаду ошибок.

Итак, у вас нет выбора, кроме как использовать в токенах классов только необработанные типы, например

GWT.create(Razmataz.class);
7
ответ дан 4 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: