Java相当于C#扩展方法

我正在寻找在对象列表中实现一个功能,就像我在C#中使用扩展方法一样。

像这样的东西:

List<DataObject> list; // ... List initialization. list.getData(id); 

我如何在Java中做到这一点?

Java不支持扩展方法。

相反,你可以制定一个常规的静态方法,或者编写你自己的类。

扩展方法不仅仅是静态的方法,并不仅仅是方便的语法糖,实际上它们是相当强大的工具。 主要的是可以根据不同的泛型参数实例化来覆盖不同的方法。 这与Haskell的类型类似,事实上,它们看起来像是在C#中支持C#的Monads(即LINQ)。 即使放弃LINQ语法,我仍然不知道在Java中实现类似接口的方式。

我不认为有可能在Java中实现它们,因为Java的泛型参数的类型擦除语义。

XTend语言 – 这是Java的超级集合,编译为Java源代码1 – 支持这一点。

Lombok项目提供了一个注解@ExtensionMethod ,可以用来实现你所要求的功能。

另一个选择是使用google-guava库中的ForwardingXXX类。

Java没有这样的功能。 相反,您可以创建列表实现的常规子类或创建匿名内部类:

 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路线图上。

在这个问题上晚了点,但万一有人发现它有用,我只是创建了一个子类:

 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); } } } 

可以使用装饰器面向对象的设计模式 。 在Java标准库中使用这种模式的一个例子是DataOutputStream 。

以下是一些用于扩充列表功能的代码:

 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#扩展方法的默认方法。