Это может быть редким случаем, но для тех из вас, кто использует Picasso , вы увидите эту ошибку, если попытаетесь загрузить изображение с URL, но URL не ссылается на изображение.
Например:
http://www.google.ca
вместо:
https: //www.google.ca/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png
Код выглядел примерно так?
obj.someMethod(myVar,3,new FooObject() {
public void bar() {
return "baz";
}
});
Если да, то метод передается не в другой метод в качестве аргумента, а в анонимный внутренний класс создается, и экземпляр этого класса передается в качестве аргумента.
В приведенном выше примере FooObject
является абстрактным классом, который не реализует bar ()
метод. Вместо создания частного класса
, расширяющего FooObject
, мы создаем экземпляр абстрактного класса и обеспечиваем реализацию абстрактного метода в соответствии с остальной частью кода.
Вы не можете создать экземпляр абстрактного класса, поэтому мы должны предоставить недостающий метод для создания полного определения класса. Поскольку этот новый класс создается на лету, у него нет имени, следовательно, анонимный . Поскольку он определен внутри другого класса, это анонимный внутренний класс.
Это может быть очень удобный ярлык, особенно для классов Listener
, но он может затруднить отслеживание вашего кода, если вы увлекаетесь, и определения встроенных методов становятся слишком длинными.
с использованием java.lang.reflect.Method
public void callMethod(Method aMethod, int value) throws Exception {
aMethod.invoke(this, value);
}
public void print(Integer value) {
System.out.print(value);
}
public void println(Integer value) {
System.out.println(value);
}
public void demo() throws Exception {
Method println = this.getClass().getMethod("println", Integer.class);
Method print = this.getClass().getMethod("print", Integer.class);
callMethod(println, 10);
callMethod(print, 10);
}
В Java нельзя передавать методы в качестве параметров. Мог ли он передать не метод, а анонимный внутренний класс?
Это может быть полезно для передачи поведения между классами. Для получения дополнительной информации используйте Google "внедрение зависимостей" или "инверсия управления".
Сам по себе это недопустимый синтаксис в Java. Возможно, это было создание нового экземпляра анонимного класса?
Вы также можете сделать что-то вроде этого:
final Predicate somePredicate = new Predicate<Item>()
{
@Override
public boolean apply(Item item)
{
return item.someProperty().equals(something);
}
}
И использовать это так:
List<Item> filteredList = filter(list, somePredicate);
Я делал подобные вещи раньше. Я также написал методы, которые используют замыкание для создания и возврата анонимной реализации интерфейса аналогичным образом:
Predicate isSomeColor(final Color color)
{
return new Predicate<Shape>()
{
@Override
public boolean apply(Shape shape)
{
return shape.getColor().equals(color);
}
}
}
List<Shape> redShapes = filter(shapes, isSomeColor(Color.RED);
Все это все еще анонимные внутренние классы. На самом деле я нигде не называю сам класс, у меня просто ссылка на экземпляр класса.
это называется отражением . существует целая библиотека объектов, представляющих такие вещи, как конструкторы, методы и тому подобное.
вы можете использовать его, например, для вызова динамического метода , который определяется во время выполнения.
Да, можно объявить метод в списке параметров другого метода. Вы можете проверить java.lang.reflect.Method
. Используя отражение, вы получаете объект Method, представляющий метод, который вы хотите передать в качестве параметра. Затем вы можете вызвать Method для вызова этого метода.
Более того, вы можете обратиться к «Функциональному программированию на языке Java» ( http: //www.ibm.com/developerworks/java/library /j-fp.html), который может дать вам подробную информацию с примерами.
ближайшим к аргументу функции является
экземпляр анонимного класса с ровно одним методом.
Runnable a = new Runnable(){
run(){
System.out.println("hello");
}
}
myMethod(a);
Приведенные выше ответы различаются в зависимости от того, возможно ли это вообще. Возможно ли это через отражение? Возможно ли использование анонимного внутреннего класса? Нам нужно это прояснить.
Вы когда-нибудь видели Функциональную Java ? Это очень интересная библиотека, которая позволяет вам программировать, как в Scala . Я писал об этой библиотеке. Признаюсь, лучше использовать более гибкий синтаксис (замыкания BGGA), например Scala.
Использование функциональной Java с функцией высокого порядка, такой как карта, в списке, который у нас есть:
final List<Integer> numbers = list(1, 2, 3, 4, 5);
List<Integer> c = numbers.map(new F<Integer, Integer>() {
public Integer f(Integer arg) {
return arg * arg;
}
});
Еще одна полезная библиотека - lambdaj , предлагающий приятные способы игры, как в функциональном программировании (FP). Java имеет ограниченный синтаксис по сравнению с языками FP. Но вы все равно можете воспользоваться некоторыми преимуществами стиля FP, но вы должны проявить изобретательность!
Ближайшее к передаче указателя функции в Java - это передача анонимного экземпляра абстрактного класса или интерфейса. Например, универсальный тип функции может быть закодирован в интерфейсе следующим образом:
public interface F<A, B> {
public B f(final A a);
}
Затем вы можете ожидать метод в списке аргументов другого метода:
public List<B> map(List<A> as, F<A, B> f) {
...
}
И вы можете вызвать его с анонимным экземпляром этого интерфейса:
map(myList, new F<Integer, String>() {
public String f(Integer i) {
return String.valueOf(i);
}
});
Есть библиотека под названием Функциональная Java , которая использует именно эту идею для большой пользы великолепного языка Java.