Fab*_*iro 166 java extension-methods
我希望在C#中使用扩展方法实现对象列表中的功能.
像这样的东西:
List<DataObject> list;
// ... List initialization.
list.getData(id);
Run Code Online (Sandbox Code Playgroud)
我如何用Java做到这一点?
SLa*_*aks 186
Java不支持扩展方法.
相反,您可以创建常规静态方法,或编写自己的类.
use*_*250 55
扩展方法不仅仅是静态方法,而不仅仅是方便语法糖,实际上它们是非常强大的工具.主要的是能够根据不同的泛型参数实例化覆盖不同的方法.这类似于Haskell的类型类,事实上,它们看起来像是在C#中支持C#的Monads(即LINQ).即使删除LINQ语法,我仍然不知道在Java中实现类似接口的任何方法.
而且我认为不可能在Java中实现它们,因为Java的泛型参数的类型擦除语义.
Tho*_*ger 17
Project Lombok提供了一个注释@ExtensionMethod,可用于实现您要求的功能.
从技术上讲,C#Extension在Java中没有等效功能。但是,如果您确实想实现这样的功能以获得更清晰的代码和可维护性,则必须使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
Java没有这样的功能.相反,您可以创建列表实现的常规子类或创建匿名内部类:
List<String> list = new ArrayList<String>() {
public String getData() {
return ""; // add your implementation here.
}
};
Run Code Online (Sandbox Code Playgroud)
问题是调用此方法.你可以"到位"做到:
new ArrayList<String>() {
public String getData() {
return ""; // add your implementation here.
}
}.getData();
Run Code Online (Sandbox Code Playgroud)
看起来 Defender 方法(即默认方法)有可能进入 Java 8。但是,据我了解,它们只允许an 的作者interface追溯扩展它,而不允许任意用户。
Defender 方法 + 接口注入将能够完全实现 C# 风格的扩展方法,但 AFAICS、接口注入甚至还没有出现在 Java 8 路线图上。
有没有在java扩展方法,但你可以把它歧管如下,
您可以通过以下示例为字符串定义“echo”方法,
@Extension
public class MyStringExtension {
public static void echo(@This String thiz) {
System.out.println(thiz);
}
}
Run Code Online (Sandbox Code Playgroud)
之后,您可以在任何地方使用此方法(回声)处理字符串,例如,
"Hello World".echo(); //prints "Hello World"
"Welcome".echo(); //prints "Welcome"
String name = "Jonn";
name.echo(); //prints "John"
Run Code Online (Sandbox Code Playgroud)
当然,你也可以有这样的参数,
@Extension
public class MyStringExtension {
public static void echo(@This String thiz, String suffix) {
System.out.println(thiz + " " + suffix);
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用,
"Hello World".echo("programming"); //prints "Hello World programming"
"Welcome".echo("2021"); //prints "Welcome 2021"
String name = "John";
name.echo("Conor"); //prints "John Conor"
Run Code Online (Sandbox Code Playgroud)
您也可以查看此示例,Manifold-sample
| 归档时间: |
|
| 查看次数: |
85856 次 |
| 最近记录: |