2016-04-11 2 views
1

Я пытаюсь создать фреймворк.Как передать тип возвращаемого значения в качестве параметра (без отражения?)

Эта структура сделана для анализа данных из Интернета внутренне, и предоставить его пользователю рамок (API)

Per Например:

  • Каркас имеет класс BasicUser с (String имя, длинное создание)
  • Этот класс реализует интерфейс под названием «Пользователь», который описывает основное поведение.
  • Каждый раз, когда этот пользователь упомянут где-то, я называю своего рода Listener, давая «Пользователь» Объект

Сейчас это является большим, и все, так как они могут получить доступ к Пользователю, но я хочу, чтобы люди, которые использовать фреймворк, чтобы сделать свои собственные реализации Пользователя.

Я хочу, чтобы они не делали кучу обертывания.

Кто-то, кто использует мою Framework, должен иметь возможность изменить «BasicUser» на класс, созданный пользователем (который реализует «Пользователь»).

(should be able to change "BasicUser" -> Не в состоянии изменить сам класс, но вместо того, чтобы изменить класс объекта, который получает созданный для новых пользователей к другой реализации «Пользователь»)

Можно ли сделать это без использования отражение?

Возможно ли также, что объект «Пользователь», переданный слушателю, может быть автоматически добавлен в класс, предоставленный пользователем инфраструктуры, используя Generics?

+0

Знаете ли вы, что интерфейсы/вы изучили, как бы они помочь случай использования? –

+0

@DarthAndroid да! Я делаю. Я использую интерфейсы, поэтому моя инфраструктура может использовать их внутри себя! Я хочу, чтобы пользователь в принципе мог добавить свой собственный mumbo jumbo вокруг него, не обертывая весь BaseUser, им не нужны интерфейсы. Они никогда не узнают, что «BaseUser» (кроме стандартного имени и даты создания) даже существует , Я хочу вернуть им свой класс. –

+0

Итак, если я читаю это правильно, у вас есть структура, которая имеет методы, которые принимают объект «Пользователь». пользователи вашего фреймворка создадут класс, который не расширяет BaseUser, а реализует User. В вашей статье есть методы, которые должны возвращать объект обратно пользователю как тот же самый тип, который они передают, - тип, который они создали, который реализует пользователя. Это правильно? – AAG

ответ

3

Передайте либо экземпляр типа, например.

<T> T getResult(T instance) { ... } 

Float result = getResult(Float.valueOf(1.0f)); 

или общий тип, который параметризуется возвратным типом, например.

<T> T getResult(Class<T> clazz) { ... } 

String result = getResult(String.class); 

или с параметризованным Список

<T> T getResult(List<T> list) { ... }`. 

List<Integer> list = new ArrayList<>(); 
Integer result = getResult(list); 
+0

Спасибо, поэтому, если я храню класс <> в поле, могу ли я ссылаться на это? Кажется, что мой лучший план - это когда создается экземпляр класса рамки, чтобы дать конструктору класс возвращаемого типа, поэтому я могу использовать одно и то же поле, чтобы каким-то образом создать экземпляр? –

+0

@ Джорди да. Просто обратите внимание, что если вы хотите перейти в 'instanceOfT.getClass()', у которого есть тип 'Class ', поэтому параметр и поле, в которое вы его храните, должны иметь этот тип тоже. Вы можете добавить '? extends' и все еще используют 'T'. –

+0

Передача типа в качестве параметра - беспорядочный способ сделать это. Вместо этого вызывается его с параметризованным типом, например: 'String result = this. getResult() ' – AAG

Смежные вопросы