Есть два способа реализации ALL предиката:
public interface Predicate<T> {
public static final Predicate<Object> ALL = new Predicate<Object> {
@Override public boolean accepts(Object in) { return true; }
}
boolean accepts(T in);
}
Вы объявляете поле конкретного класса (константа) здесь, так что вы должны использовать конкретную замену переменного типа T. Как вы не интересующийся типом, вы используете супертип всех объектов: java.lang.Object.
Эта реализация будет удовлетворять компилятору, чтобы не генерировать никаких предупреждений и является хорошей отправной точкой. Однако у вас есть некоторые трудности.Рассмотрим этот код:
public class PredicateTester {
public static void main(String[] args) {
test1(Predicate.ALL, "some string"); // compiler error
test2(Predicate.ALL, "some string");
}
public static void test1(Predicate<String> pred, String in) {
System.out.println(pred.accepts(in) ? "pass" : "fail");
}
public static void test2(Predicate<? super String> pred, String in) {
System.out.println(pred.accepts(in) ? "pass" : "fail");
}
}
Хотя test1 и test2 являются допустимыми методами (и компилировать штраф), вызов метода test1 не будет компилироваться. Проще говоря: A Predicate < Объект > не является предикатом <String>.
Вывод: вы должны помнить, что PECS (продюсер продлевает, потребительский супер) при разработке ваших методов, которые будут использовать предикат в качестве аргумента.
Другой вариант просто не обеспечивает тип вообще:
public interface Predicate<T> {
@SuppressWarnings("rawtypes")
public static final Predicate ALL = new Predicate {
@Override public boolean accepts(Object in) { return true; }
}
boolean accepts(T in);
}
С этой реализацией упомянутым выше класс PredicateTester компилирует просто отлично. Итак, это путь.
просто удалите фигурные скобки – Blub
В заголовке нет необходимости добавлять основной тег. –
SOrry guys, я имею в виду интерфейс ... – Bober02