Java相当于C#扩展方法
我正在寻找在对象列表中实现一个function,就像我在C#中使用扩展方法一样。
像这样的东西:
List<DataObject> list; // ... List initialization. list.getData(id);
我如何在Java中做到这一点?
Java不支持扩展方法。
相反,你可以制定一个常规的静态方法,或者编写你自己的类。
扩展方法不仅仅是静态的方法,并不仅仅是方便的语法糖,实际上它们是相当强大的工具。 主要的是可以根据不同的generics参数实例化来覆盖不同的方法。 这与Haskell的types类似,实际上,它们看起来像是在C#中支持C#的Monads(即LINQ)。 即使放弃LINQ语法,我仍然不知道在Java中实现类似接口的方式。
我不认为有可能在Java中实现它们,因为Java的generics参数的types擦除语义。
XTend语言 – 这是一个超级Java的集合,并编译为Java源代码1 – 支持这一点。
Lombok项目提供了一个注解@ExtensionMethod
,可以用来实现你所要求的function。
另一个select是使用google-guava库中的ForwardingXXX类。
Java没有这样的function。 相反,您可以创build列表实现的常规子类或创build匿名内部类:
List<String> list = new ArrayList<String>() { public String getData() { return ""; // add your implementation here. } };
问题是要调用这个方法。 你可以做到“到位”:
new ArrayList<String>() { public String getData() { return ""; // add your implementation here. } }.getData();
看起来Defender方法(也就是默认方法)可能会让它成为Java 8的一个小机会。但据我所知,它们只允许interface
的作者追溯扩展它,而不是任意的用户。
然后,Defender Methods + Interface Injection将能够完全实现C#风格的扩展方法,但是AFAICS,Interface Injection甚至不在Java 8路线图上。
在这个问题上晚了点,但万一有人发现它有用,我只是创build了一个子类:
public class ArrayList2<T> extends ArrayList<T> { private static final long serialVersionUID = 1L; public T getLast() { if (this.isEmpty()) { return null; } else { return this.get(this.size() - 1); } } }
可以使用装饰器面向对象的devise模式 。 在Java标准库中使用这种模式的一个例子是DataOutputStream 。
以下是一些用于扩充列表function的代码:
public class ListDecorator<E> implements List<E> { public final List<E> wrapee; public ListDecorator(List<E> wrapee) { this.wrapee = wrapee; } // implementation of all the list's methods here... public <R> ListDecorator<R> map(Transform<E,R> transformer) { ArrayList<R> result = new ArrayList<R>(size()); for (E element : this) { R transformed = transformer.transform(element); result.add(transformed); } return new ListDecorator<R>(result); } }
PS我是Kotlin的忠实粉丝。 它有扩展方法,也运行在JVM上。
Java
8现在支持类似于C#
扩展方法的默认方法。