【问题标题】:Is there a functionality in Java similar to C#'s anonymous types?Java 中是否有类似于 C# 的匿名类型的功能?
【发布时间】:2011-07-22 18:04:27
【问题描述】:

我想知道 Java 中是否存在类似于 C# 的匿名类型的类似功能:

var a = new {Count = 5, Message = "A string."};

或者这个概念是否违背了 Java 范式?

编辑:

我想在 Java 中使用 Hashable() 有点类似。

【问题讨论】:

  • 添加了匿名类型以支持 LINQ,因为它最常见的用例之一是将一个序列的元素投影到另一个序列。如果您告诉我们您希望如何使用它们,或许我们可以提出一个好的替代方案。
  • 大多数情况下 Map 比 Hashtable 好。看看我的回答中的例子。

标签: java anonymous-types


【解决方案1】:

没有。没有等价物。 Java 中没有无类型变量声明 (var),Java 编译器可以使用自动生成的类型名称填充以允许访问 a.Counta.Message

【讨论】:

    【解决方案2】:

    也许你的意思是这样的:

    Object o = new Object(){
        int count = 5;
        String message = "A string.";
    };
    

    @Commenters:当然这是一个理论上的,非常不方便的例子。

    可能 OP 可能会使用Map

    Map<String,Object> a = new HashMap<String,Object>();
    a.put("Count", 5);
    a.put("Message", "A string.");
    
    int count = (Integer)a.get("Count"); //better use Integer instead of int to avoid NPE
    String message = (String)a.get("Message");
    

    【讨论】:

    • 除非我弄错了,否则你不能做例如o.count 之后 - 属性将无用。
    • @zacheusz:这正是我想要的。谢谢。
    • @delnan 如果你知道这些名字,我想你可以反思一下。
    • @defnan 属性不是没用的。对象 0 = new Object() { int count = 0 ; public String toString ( ) { return "这个对象已经被toString'ed " + (count++) + " 次。" ; }
    • @Mike Samuel:看看这个 sn-p:Object o = new Object(){private int count = 5;};Field f = o.getClass().getDeclaredField("count");f.setAccessible(true);int c = f.getInt(o); 我知道这很奇怪,不方便而且很慢。但它有效;)顺便说一句,我在回复中添加了Map 的示例。
    【解决方案3】:

    Java 有一个叫做本地类的特性,它们有点相似。它们对于创建类或实现在特定方法之外不需要真正了解的接口很有用。本地类的范围受定义它的代码块的限制。

    public void doSomething() {
        class SomeLocalClass {
            public int count = 5;
            public String message = "A string.";
        }
    
        SomeLocalClass local = new SomeLocalClass();
        System.out.println(local.count);
        System.out.println(local.message);
    }
    

    与 C# 中的匿名类型不同,Java 本地类及其字段具有明确定义的类型,但我想它们可能有一些重叠的用例。

    【讨论】:

    • 这与我遇到这个问题时所寻找的非常接近。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2021-11-23
    相关资源
    最近更新 更多