在C#中创建匿名对象的Java等价物是什么?

Cod*_*ody 24 c# java

在C#中,您可以执行以下操作:

var objResult = new { success = result };

这有一个java等价物吗?

Dav*_*ebb 23

Java没有通过var关键字向C#提供类型推断,因此虽然您可以创建匿名类型,但由于您无法获取其属性,因此它们并不是很好.

所以你可以像这样创建一个匿名类的实例:

Object myobj = new Object() {
  public final boolean success = true;
}
Run Code Online (Sandbox Code Playgroud)

但由于myobj是实例Object您无法访问success您的代码,因为你已经创建了一个实例匿名类中,根据定义没有办法明确地提及这一类.

在C#中var通过推断类型来解决这个问题,但是在Java中无法做到这一点.

通常,匿名类用于创建接口和抽象类的实现,因此使用接口或父类作为类型进行引用.

  • 要读到这一点,你需要为一个简单的类/类型创建一个类文件是非常疯狂的,它具有一些扩展可读性的属性.让人惊讶. (4认同)
  • 是的,我真的很高兴从.Net项目转移到java ..这很疯狂 (2认同)

dus*_*sky 11

使用Java 10,您可以使用匿名类:

boolean result = true;

var objResult = new Object() {
    boolean success = result;
};

System.out.println(objResult.success);
Run Code Online (Sandbox Code Playgroud)

您可以将它们与流一起使用:

var names = List.of("John", "Peter", "Olaf");

var namesAndLength = names.stream().map(n -> new Object() {
    String name = n;
    int length = n.length();
}).collect(toList());
Run Code Online (Sandbox Code Playgroud)

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

https://developer.oracle.com/java/jdk-10-local-variable-type-in​​ference


And*_*yle 9

你绝对可以写出等价的

Object objResult = new Object() {
    boolean success = result;
}
Run Code Online (Sandbox Code Playgroud)

你在这种情况下所做的是创建一个内联的匿名子类Object,它包含一个success实例化为值的字段result(我假设这里是一个布尔值,但可以是任何东西).

但是,这不是很有用 - 因为Java是强类型的,并且您无法引用您创建的匿名类,您将无法在success任何地方引用该变量.匿名子类通常用于实现单方法接口,或者可能提供超类方法的覆盖 - 这两种情况都更有用,因为其他代码可以通过父类/接口上声明的方法调用重写行为.

所以Object的匿名子类可能有用,可能如下所示:

Object objresult = new Object() {
    @Override public String toString() {
        return result.toString(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以调用此行为objResult.toString(),以便获取字符串化结果.

在实践中,最好使用getResult()方法定义接口,然后使用具体或匿名类来实现它.


CKu*_*uck 9

您只是很难再次获取信息:

Object objResult = new Object(){ public final boolean success = result; };
Run Code Online (Sandbox Code Playgroud)

要获取字段,您必须使用反射:

objResult.getClass().getDeclaredField("success").getBoolean(objResult)
Run Code Online (Sandbox Code Playgroud)

对于不同类型的字段,success您将需要不同的值来获取.