我有一个具有以下功能的类:
public class Entity{
public void apply(final Function<Item, Item> function) {}
}
如何用这种方法拨打电话?
示例:
Entity entity = new Entity();
entity.apply( ??? );
答案 0 :(得分:1)
您需要传递一个Function<Item, Item>
的函数,该函数需要一个Item
并返回一个Item
,假设您有一个类似
class Item {
Item doThis() {
return this;
}
}
您将能够做到:
Function<Item, Item> fct = itm -> itm.doThis();
entity.apply(fct);
哪个是lambda形式的
Function<Item, Item> fct2 = new Function<Item, Item>() {
@Override
public Item apply(Item item) {
return item.doThis();
}
};
entity.apply(fct);
答案 1 :(得分:1)
可能可以使用Consumer<?>
public class Entity{
void consumingMethod(Consumer<Object> consumer) {
consumer.accept(this::methodToConsume)
}
void methodToConsume(Object o){
....
}
}
Object
可以替换为特定类型,我使用了几种类型,而Object
最适合我
答案 2 :(得分:1)
您正在使用Java中所谓的“泛型”。泛型有助于多态(如您所知),因为它可以在不同的上下文中采用不同的“类型”,具体取决于您希望这些类型是什么。因此,在您的示例中,您可以将一个Object传递给该方法,该方法包含您想要泛型成为的任何类型。这是您的通用类型(函数)作为类的示例:
public class Function<T, I> {
}
由于此类型采用类型(T和I),因此在Java中实质上是“映射”。下面是如何创建函数类型的对象的示例:
Function<Integer, String> function = new Function<Integer, String>();
这是将这个对象传递给函数的方法:
apply(function);
请注意,您可能需要在Function类中为要用于此泛型的Wrappers的值创建一个构造函数。下面是您的apply方法定义的样子(它不需要是静态的,在创建伪代码时我只是为了简化起见。它可以是您的“实例”(非静态)方法提到):
public static void apply(Function f) {
}