Java7 : What is some equivalent to specifing method references in a function call

标签 java java-7 method-reference

我想编写一个方法来调用适当对象上的指定方法。
需要注意的是,我想在不更改调用该方法的类(例如实现接口(interface))的情况下执行此操作。

我在 C 语言的函数指针中找到了我想要的东西,但在 Java 7 中还没有找到。

这里有一些伪代码:

public class A {
    ... constructor ...

    public String aToString(){
        return "A";
    }
}

public class B {
    ... constructor ...

    public String bToString(){
        return "B";
    }
}
/* T::<String>mymethod stands for "Method with identifier 'mymethod'
 * in Class T with return type String"
 */
public class ServiceClass {
    public static void genericToString(Collection<T> c, 
                                       MethodPointer T::<String>mymethod){
        for(int i=0,i<c.length,i++) {
            System.out.println(c.get(i).mymethod());

        }
    }

    public static void main(){
        ArrayList<A> listA = new ArrayList<A>();
        listA.add(new A());
        ServiceClass.genericToStringOutput(listA, A::<String>aToString);

        ArrayList<B> listB = new ArrayList<B>();
        listB.add(new B());
        ServiceClass.genericToStringOutput(listB, B::<String>bToString);
    }
}

有没有办法在 Java 7 中实现类似的功能?唯一的限制是 A 类和 B 类不能改变。

如果类型未对编译器隐藏,则可获得奖励积分。

最佳答案

创建或选择一个Function接口(interface)并将其传入:

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

class A {
  public String aToString() {
    return "A";
  }
}

class B {
  public String bToString() {
    return "B";
  }
}

interface Function<IN, OUT> {
  OUT apply(IN input);//see guava for a prefab version of this
}

class ServiceClass {
  public static <T> void genericToString(Collection<T> c, Function<T, String> converter) {
    for (final T element : c) {
      System.out.println(converter.apply(element));
    }
  }

  public static void main() {
    List<A> listA = new ArrayList<>();
    listA.add(new A());
    ServiceClass.genericToString(listA, new Function<A, String>() {//the java 7 way
      @Override
      public String apply(final A input) {
        return input.aToString();
      }
    });

    List<B> listB = new ArrayList<>();
    listB.add(new B());
    ServiceClass.genericToString(listB, B::bToString);//the java 8 way
  }
}

关于Java7 : What is some equivalent to specifing method references in a function call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41897084/

相关文章:

kotlin - RxKotlin collectInto() MutableList 使用方法引用

Java 编译因方法引用而失败,但适用于 lambda

java - 使用没有 fragment 的选项卡布局

java - udp端口失败,服务器无法启动

java - Servlet pdf下载按钮创建

java - 自定义 Swing 组件向父类返回值

java - OpenCSV 避免使用 FileWriter 并返回 InputStream

执行 Ghost4J 时出现 java.lang.IllegalStateException(Linux 32 位与 64 位)

java - 在 JDK 1.7 中连接到 https 站点时出现问题

java - 为什么 Google Guava 的 ArrayListMultimap clear 方法在被方法引用调用时会抛出 IllegalAccessError?