Я пытаюсь использовать указатель FirAnnotations для вызова init, но это ноль, и я должен использовать FIRGeoPoint там.
for (MKPointAnnotation *point in annotationsArray) {
FIRGeoPoint *FirAnnotations;
FirAnnotations = [[FIRGeoPoint alloc] initWithLatitude:point.coordinate.latitude longitude:point.coordinate.longitude];
NSLog(@"annotations: %@",annotations);
}
Изменить : начиная с Java 8, лямбда-выражения являются хорошим решением, поскольку другие ответы указали . Ответ ниже был написан для Java 7 и более ранних версий ...
// NOTE: code not tested, but I believe this is valid java...
public class CommandExample
{
public interface Command
{
public void execute(Object data);
}
public class PrintCommand implements Command
{
public void execute(Object data)
{
System.out.println(data.toString());
}
}
public static void callCommand(Command command, Object data)
{
command.execute(data);
}
public static void main(String... args)
{
callCommand(new PrintCommand(), "hello world");
}
}
Изменить: как Пит Киркхэм указывает , есть другой способ сделать это, используя Посетитель . Подход посетителя немного сложнее - все ваши узлы должны быть осведомлены о посетителях с помощью метода acceptVisitor ()
, но если вам нужно пройти по более сложному графу объектов, его стоит изучить.
Пример решения с отражением, переданный метод должен быть общедоступен
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
public class Program {
int i;
public static void main(String[] args) {
Program obj = new Program(); //some object
try {
Method method = obj.getClass().getMethod("target");
repeatMethod( 5, obj, method );
}
catch ( NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
System.out.println( e );
}
}
static void repeatMethod (int times, Object object, Method method)
throws IllegalAccessException, InvocationTargetException {
for (int i=0; i<times; i++)
method.invoke(object);
}
public void target() { //public is necessary
System.out.println("target(): "+ ++i);
}
}
У Java есть механизм передачи названия и называть его. Это часть механизма отражения. Ваша функция должна предпринять дополнительные параметры метода класса.
public void YouMethod(..... Method methodToCall, Object objWithAllMethodsToBeCalled)
{
...
Object retobj = methodToCall.invoke(objWithAllMethodsToBeCalled, arglist);
...
}
В прошлый раз я проверил, Java не способен в том, что он не способен тем, что вы хотите; Вы должны использовать «рабочие вокруг», чтобы обойти такие ограничения. Насколько я вижу это, интерфейсы являются альтернативой, но не хорошей альтернативой. Возможно, кто бы сказал вам, что это значит что-то вроде этого:
public interface ComponentMethod {
public abstract void PerfromMethod(Container c);
}
public class ChangeColor implements ComponentMethod {
@Override
public void PerfromMethod(Container c) {
// do color change stuff
}
}
public class ChangeSize implements ComponentMethod {
@Override
public void PerfromMethod(Container c) {
// do color change stuff
}
}
public void setAllComponents(Component[] myComponentArray, ComponentMethod myMethod) {
for (Component leaf : myComponentArray) {
if (leaf instanceof Container) { //recursive call if Container
Container node = (Container) leaf;
setAllComponents(node.getComponents(), myMethod);
} //end if node
myMethod.PerfromMethod(leaf);
} //end looping through components
}
, который вы бы тогда ссылались с:
setAllComponents(this.getComponents(), new ChangeColor());
setAllComponents(this.getComponents(), new ChangeSize());
Используйте объект java.lang.reflect.Method
и вызовите invoke
Используйте шаблон наблюдателя (иногда также называемый шаблоном слушателя):
interface ComponentDelegate {
void doSomething(Component component);
}
public void setAllComponents(Component[] myComponentArray, ComponentDelegate delegate) {
// ...
delegate.doSomething(leaf);
}
setAllComponents(this.getComponents(), new ComponentDelegate() {
void doSomething(Component component) {
changeColor(component); // or do directly what you want
}
});
new ComponentDelegate () ...
объявляет анонимный тип, реализующий интерфейс.
Сначала определите Интерфейс с методом, который вы хотите передать в качестве параметра
public interface Callable {
public void call(int param);
}
Реализуйте класс с помощью метода
class Test implements Callable {
public void call(int param) {
System.out.println( param );
}
}
// Вызвать подобным образом
Callable cmd = new Test();
Это позволяет передать cmd в качестве параметра и вызвать вызов метода, определенный в интерфейсе
public invoke( Callable callable ) {
callable.call( 5 );
}