2013-12-22 2 views
2

Я использую довольно стандартный синтаксис здесь, я думаю:выборки возвращает тип записи, что привычка ввергнуть к записи

Result<Record> = [DSLContext].selectDistinct(...).fetch(); 

, но она не будет компилироваться, так как вышеприведенные возвращает записи объектов типа

Result<Record4<T1, T2, ...> 

который является самогенерированным интерфейсом, который является вспомогательным интерфейсом записи, но компилятор остается недовольным

Я полагаю, что обычно java будет рассматривать это как неявное литье? не похоже, что я должен делать какие-либо явные литья ...

советы? благодаря

ответ

1

Если List<Banana> был List<Fruit>, можно добавить яблоки в List<Banana>:

List<Banana> bananaList = new ArrayList<>(); 
List<Fruit> fruitList = bananaList; 
fruitList.add(new Apple()); 

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

Вы, вероятно, хотите

Result<? extends Record> result = [DSLContext].selectDistinct(...).fetch(); 
+0

Вы можете даже удобно написать 'Результат ', потому что '' имеет верхнюю границу объявления-записи 'Record' –

1

К сожалению, Java не знает декларации сайтов дисперсии, как C# или Scala:

// C# style 
interface Result<out Record> { ... } 

// Scala style 
trait Result[+Record] { ... } 

Оба выше позволило бы назначить следующие

Result<Record4<T1, ...>> r1 = ... 
Result<Record> r2 = r1; 

Но Result действительно определяется как:

interface Result<R extends Record> {} 

Теперь, так как ваше выражение запроса связывается <R> с Record4<T1, ...>, это то, что вы собираетесь получить:

Result<Record4<T1, ...>> r1 = selectDistinct(...).fetch(); 

В качестве альтернативы, вы можете просто использовать дикие карты

Result<? extends Record> r2 = r1; 

// Or shorter: 
Result<?> r3 = r1; 

Другим вариантом является принудительное удаление типов безопасности при выражении вашего запроса:

Result<Record> r4 = selectDistinct(new Field[] { ... }).fetch(); 
+0

ohhhhh ... right! Большое спасибо – toilinginobscurity

+0

@toilinginobscurity: Какая часть помогла больше всего? :-) –

+0

hi lukas - что мне действительно нужно было мини-учебник в дженериках, подстановочных знаках и т. Д., Которые я получил! jooq классный, спасибо за всю вашу тяжелую работу – toilinginobscurity

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