2014-08-29 4 views
1
<D extends com.j256.ormlite.dao.Dao<T,?>,T> D getDao(Class<T> clazz) 

Я не могу понять, выше заявлениеJava Generic Тип Синтаксис

getDao (класс clazz) возвращает D

D, имеющий следующие ограничения

D extends com.j256.ormlite.dao.Dao<T,?> 

и дополнительные , T я не могу понять.

Не могли бы вы объяснить это?

+0

Этот метод требует двух параметров типа: 'D' и' T', а 'D' имеет дополнительное ограничение' extends', в зависимости от 'T'. Не путайте это ', T', они не принадлежат друг другу. –

ответ

2

Этот метод имеет два параметров типа, D и T, с D с дополнительным extends ограничения, в зависимости от T. Не путайте этот синтаксис <T,?>,T; ,T делает не принадлежит к ограничению, но является вторым параметром, говорящим Java, что T не является именем конкретного класса.

Если вы добавите пробел или измените параметры, он станет более четким. Вот аналогичный, но несколько более простой пример. Эти сигнатуры методов эквивалентны:

<D extends List<T>,T> D createListOf(Class<T> clazz) // your version 
<D extends List<T>, T> D createListOf(Class<T> clazz) // extra space 
<T, D extends List<T>> D createListOf(Class<T> clazz) // different order 

Имейте в виду, что, хотя это может показаться очевидным, что T еще один параметр типа, это не ясно Java. Может существовать фактический класс с именем T, поэтому мы должны быть явным, что T является параметром типа.

И наоборот, параметры типа не ограничиваются отдельными символами. У вас также может быть параметр типа Foo или даже String, если вы хотите полностью смутить своих сотрудников. Возможно, это дает понять, почему необходимо декларировать все параметры типа с использованием <...>.

// just a deterrent example; don't do this! String as parameter, not class 
<String, Foo extends List<String>> Foo createListOf(Class<String> clazz) 
+0

\ @tobias_kas, вы говорите, что параметр секунды возвращаемого типа слишком просто говорит Java, что T не является название конкретного класса. это же самая информация может передаваться и с первым параметром? –

+0

@AmitYadav Вы имеете в виду, не должно быть достаточно, чтобы 'T' использовался в ограничении для' D'? Нет. Нет правила, что имя класса должно иметь более одной буквы, поэтому «T» также может быть именем конкретного класса. –

+0

\ @tobias_k Я согласен с вами в том, что мы можем создать класс имени Т. Я думаю, что у меня недостаточно знаний об универсальном типе. Все, что вы хотите сказать, что в обратном типе T как 2-й параметр должен сообщить java, что T не является конкретным классом ... надеюсь, что позже я буду придерживаться этой концепции. благодаря! –

1

Этот метод будет:

  • возвращает объект типа D
  • Где D находится или проходит com.j256.ormlite.dao.Dao, параметризованных с объектом типа T или расширения/реализации T и неизвестного типа параметра
  • Если данный аргумент представляет собой класс типа T

Он использует много общей абстракции, что неудивительно, учитывая, что он предоставляет DAO (объект доступа к данным).

+0

Я смущаюсь о возврате типа. Он возвращает D <1-го ограничения, 2-е ограничения> 1-е ограничение = D extends com.j256.ormlite.dao.Dao это отлично для меня ... Я спрашиваю, нужны ли ему 2-го ограничения? –

+0

Думаю, я понимаю, что вы имеете в виду.Так как это общий метод, там должен быть объявлен параметр типа 'T'. В противном случае на него нельзя ссылаться параметром метода или параметризацией 'com.j256.ormlite.dao.Dao'. – Mena

+0

\ @Mena Я не путаюсь с аргументами метода T вместо возвращаемого типа T, упомянутого как второй параметр <1-й параметр, T> D –

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