我希望在一个对象列表中实现一种功能,就像在C#中使用扩展方法一样。
类似这样的:
List<DataObject> list;
// ... List initialization.
list.getData(id);
我该如何在Java中实现这个?
我希望在一个对象列表中实现一种功能,就像在C#中使用扩展方法一样。
类似这样的:
List<DataObject> list;
// ... List initialization.
list.getData(id);
我该如何在Java中实现这个?
Java不支持扩展方法。
相反,您可以创建一个常规的静态方法,或者编写自己的类。
扩展方法不仅仅是静态方法,也不只是便利的语法糖,实际上它们是非常强大的工具。主要的优势是可以基于泛型参数的实例化来覆盖不同的方法。这类似于Haskell的类型类,事实上,看起来C#支持了C#的单子(即LINQ)。即使放弃LINQ语法,我仍然不知道如何在Java中实现类似的接口。
而且我认为在Java中不可能实现它们,因为Java的类型擦除语义使得泛型参数无法实例化。
从技术上讲,Java没有等价的C#扩展。但是如果您想要实现这样的函数以获得更清晰的代码和可维护性,则必须使用Manifold框架。
package extensions.java.lang.String;
import manifold.ext.api.*;
@Extension
public class MyStringExtension {
public static void print(@This String thiz) {
System.out.println(thiz);
}
@Extension
public static String lineSeparator() {
return System.lineSeparator();
}
}
Java中没有扩展方法,但您可以通过 manifold 实现它,如下所示:
您可以按照以下示例为字符串定义“echo”方法,
@Extension
public class MyStringExtension {
public static void echo(@This String thiz) {
System.out.println(thiz);
}
}
之后,您可以在任何地方使用该方法(echo)输出字符串,例如:
"Hello World".echo(); //prints "Hello World"
"Welcome".echo(); //prints "Welcome"
String name = "Jonn";
name.echo(); //prints "John"
当然,您也可以像这样拥有参数:
@Extension
public class MyStringExtension {
public static void echo(@This String thiz, String suffix) {
System.out.println(thiz + " " + suffix);
}
}
并且像这样使用,
"Hello World".echo("programming"); //prints "Hello World programming"
"Welcome".echo("2021"); //prints "Welcome 2021"
String name = "John";
name.echo("Conor"); //prints "John Conor"
您可以查看这个示例,Manifold-sample。看起来 Defender Methods(即默认方法)有一些小概率会进入 Java 8。然而,据我所知,它们只允许 interface
的 作者 在后期扩展该接口,而不是任意用户。
如果加入 Interface Injection,Defender Methods 将能够完全实现类似于 C# 的扩展方法,但据我所知,Interface Injection 还没有出现在 Java 8 的路线图中。
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();
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);
}
}