Phy*_*hyr 2 java java-7 method-reference
我想编写一个在适当的对象上调用指定方法的方法。
需要注意的是,我希望在不更改调用方法的类(例如,实现接口)的情况下执行此操作。
我在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);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在Java 7中实现类似的目的?唯一的限制是类别A和类别B可能不会更改。
如果没有从编译器中隐藏类型,则可以加分。
创建或选择一个Function接口并将其传递给:
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1288 次 |
| 最近记录: |