ошибка дженериков: не применимый для аргументов

Как уже упомянуто, создавание Вашей собственной агрегатной функции является правильным поступком. Вот моя агрегатная функция конкатенации (можно найти детали на французском языке ):

CREATE OR REPLACE FUNCTION concat2(text, text) RETURNS text AS '
    SELECT CASE WHEN $1 IS NULL OR $1 = \'\' THEN $2
            WHEN $2 IS NULL OR $2 = \'\' THEN $1
            ELSE $1 || \' / \' || $2
            END; 
'
 LANGUAGE SQL;

CREATE AGGREGATE concatenate (
  sfunc = concat2,
  basetype = text,
  stype = text,
  initcond = ''

);

И затем используют его как:

SELECT company_id, concatenate(employee) AS employees FROM ...

7
задан Jeff Axelrod 5 May 2012 в 12:40
поделиться

3 ответа

Ответ прост: несвязанный подстановочный знак использовать нельзя. Это просто означает «неизвестный объект».

Это не дает компилятору ничего информативного. "?" означает любой тип, так что на самом деле это слишком общий, чтобы что-то значить.

Взгляните сюда: http://java.sun.com/docs/books/tutorial/extra/generics/wildcards.html

Как сказано:

Collection<?> c = new ArrayList<String>();
c.add(new Object()); // Compile time error

Поскольку мы не знаем, что обозначает тип элемента c, мы не можем добавлять к нему объекты. Метод add () принимает аргументы типа E, типа элемента коллекции. Когда фактический параметр типа?, Это означает какой-то неизвестный тип. Любой параметр, который мы передаем для добавления, должен быть подтипом этого неизвестного типа. Поскольку мы не знаем, что это за тип, мы не можем ничего передать. Единственное исключение - null, который является членом каждого типа.

EDIT: не волнуйтесь, это нормальное недопонимание подстановочных знаков Java, когда вы начинаете их использовать. Вот почему существуют ограниченные подстановочные знаки (например, ), в противном случае общий подстановочный знак был бы почти бесполезен, поскольку компилятор не может делать никаких предположений о нем.

12
ответ дан 6 December 2019 в 21:14
поделиться

Это не работает, потому что ваш класс Клиент написан не для конкретной Стратегии ( Стратегии ), но в метод run () , вы передаете String (что верно только для Стратегии !). Это будет работать, только если вы измените тип a и параметр setStrategy () на тип Strategy !

0
ответ дан 6 December 2019 в 21:14
поделиться

Это потому, что это небезопасная операция. "?" - это подстановочный знак, означающий, что я не знаю тип. Это не означает «любой тип». прочтите это ... http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

0
ответ дан 6 December 2019 в 21:14
поделиться
Другие вопросы по тегам:

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