Методы Java - Взятие метода AS АРГУМЕНТ AN

Это может быть редким случаем, но для тех из вас, кто использует Picasso , вы увидите эту ошибку, если попытаетесь загрузить изображение с URL, но URL не ссылается на изображение.

Например:
http://www.google.ca
вместо:
https: //www.google.ca/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

5
задан Community 23 May 2017 в 09:57
поделиться

11 ответов

Код выглядел примерно так?

obj.someMethod(myVar,3,new FooObject() {
  public void bar() {
    return "baz";
  }
});

Если да, то метод передается не в другой метод в качестве аргумента, а в анонимный внутренний класс создается, и экземпляр этого класса передается в качестве аргумента.

В приведенном выше примере FooObject является абстрактным классом, который не реализует bar () метод. Вместо создания частного класса , расширяющего FooObject , мы создаем экземпляр абстрактного класса и обеспечиваем реализацию абстрактного метода в соответствии с остальной частью кода.

Вы не можете создать экземпляр абстрактного класса, поэтому мы должны предоставить недостающий метод для создания полного определения класса. Поскольку этот новый класс создается на лету, у него нет имени, следовательно, анонимный . Поскольку он определен внутри другого класса, это анонимный внутренний класс.

Это может быть очень удобный ярлык, особенно для классов Listener , но он может затруднить отслеживание вашего кода, если вы увлекаетесь, и определения встроенных методов становятся слишком длинными.

24
ответ дан 18 December 2019 в 05:21
поделиться

с использованием 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);
}
3
ответ дан 18 December 2019 в 05:21
поделиться

В Java нельзя передавать методы в качестве параметров. Мог ли он передать не метод, а анонимный внутренний класс?

Это может быть полезно для передачи поведения между классами. Для получения дополнительной информации используйте Google "внедрение зависимостей" или "инверсия управления".

4
ответ дан 18 December 2019 в 05:21
поделиться

Сам по себе это недопустимый синтаксис в Java. Возможно, это было создание нового экземпляра анонимного класса?

1
ответ дан 18 December 2019 в 05:21
поделиться

Вы также можете сделать что-то вроде этого:

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);

Все это все еще анонимные внутренние классы. На самом деле я нигде не называю сам класс, у меня просто ссылка на экземпляр класса.

1
ответ дан 18 December 2019 в 05:21
поделиться

это называется отражением . существует целая библиотека объектов, представляющих такие вещи, как конструкторы, методы и тому подобное.
вы можете использовать его, например, для вызова динамического метода , который определяется во время выполнения.

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

Да, можно объявить метод в списке параметров другого метода. Вы можете проверить java.lang.reflect.Method

. Используя отражение, вы получаете объект Method, представляющий метод, который вы хотите передать в качестве параметра. Затем вы можете вызвать Method для вызова этого метода.

Более того, вы можете обратиться к «Функциональному программированию на языке Java» ( http: //www.ibm.com/developerworks/java/library /j-fp.html), который может дать вам подробную информацию с примерами.

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

ближайшим к аргументу функции является

экземпляр анонимного класса с ровно одним методом.

    Runnable a = new Runnable(){

   run(){
    System.out.println("hello");
        }
    }

  myMethod(a);
0
ответ дан 18 December 2019 в 05:21
поделиться

Приведенные выше ответы различаются в зависимости от того, возможно ли это вообще. Возможно ли это через отражение? Возможно ли использование анонимного внутреннего класса? Нам нужно это прояснить.

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

Вы когда-нибудь видели Функциональную 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, но вы должны проявить изобретательность!

4
ответ дан 18 December 2019 в 05:21
поделиться

Ближайшее к передаче указателя функции в 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.

3
ответ дан 18 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

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