Как уже упомянуто, создавание Вашей собственной агрегатной функции является правильным поступком. Вот моя агрегатная функция конкатенации (можно найти детали на французском языке ):
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 ...
Ответ прост: несвязанный подстановочный знак использовать нельзя. Это просто означает «неизвестный объект».
Это не дает компилятору ничего информативного. "?" означает любой тип, так что на самом деле это слишком общий, чтобы что-то значить.
Взгляните сюда: 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, когда вы начинаете их использовать. Вот почему существуют ограниченные подстановочные знаки (например, Extends Something>
), в противном случае общий подстановочный знак был бы почти бесполезен, поскольку компилятор не может делать никаких предположений о нем.
Это не работает, потому что ваш класс Клиент
написан не для конкретной Стратегии
( Стратегии >
), но в метод run ()
, вы передаете String
(что верно только для Стратегии
!). Это будет работать, только если вы измените тип a
и параметр setStrategy ()
на тип Strategy
!
Это потому, что это небезопасная операция. "?" - это подстановочный знак, означающий, что я не знаю тип. Это не означает «любой тип». прочтите это ... http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf