我想编写一个方法来调用适当对象上的指定方法。
需要注意的是,我想在不更改调用该方法的类(例如实现接口(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/