【问题标题】:Java equivalent to C# dynamic class type?Java相当于C#动态类类型?
【发布时间】:2011-04-25 13:12:31
【问题描述】:

我来自 c# 的世界。

在 C# 中,我可以使用动态类 http://msdn.microsoft.com/en-us/library/dd264741.aspx

这让我不必使用模板/泛型类,而是在某些情况下获得类似的感觉。

我在互联网搜索中一直不成功,因为不幸的是,“动态”和“java”关键字在动态架构上出现了很多不相关的信息。

我在 javaFX 中有所涉猎,并且有一个类型 var 似乎与 c# 的动态具有相同的用法。但是它似乎在 Java 中不可用。

谢谢, 斯蒂芬妮

【问题讨论】:

  • 我很好奇你是如何在 C# 中使用它的。听起来您正在使用它来逃避静态类型安全,这在 C# Java 中都不是一个好主意。

标签: java dynamic properties


【解决方案1】:

Java 不支持动态类型,但您可以使用 Java 中的动态代理来模拟类似的东西。首先,您需要声明一个接口,其中包含要在对象上调用的操作:

public interface MyOps {
  void foo();
  void boo();
}

然后为 myObjectInstance 上的动态调用创建代理:

MyOps p = (MyOps) Proxy.newProxyInstance(getClass().getClassLoader(), //
    new Class<?>[] { MyOps.class }, //
    new MyHandler(myObject));
p.foo();
p.boo();

MyHandler 的声明如下:

public class MyHandler implements InvocationHandler {
  private final Object o;

  public MyHandler(Object o) {
    this.o = o;
  }

  public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
    Method method = o.getClass().getMethod(m.getName(), m.getParameterTypes());
    return method.invoke(o, args);
  }
}

所以,如果 myObject 有方法 foo() 和 boo(),它们将被调用,否则,你会得到一个 RuntimeException。

还有一些可以在 JVM 中运行的语言支持动态类型,例如Scala、Groovy、JRuby、BeanShell、JavaScript/Rhino 等等。 Java 7 中将有一些 JVM 更改以支持原生动态调度,因此这些语言可以执行得更好,但此类功能不会直接在静态类型的 Java 语言中公开。

【讨论】:

    【解决方案2】:

    Java 中没有类似的东西

    【讨论】:

      【解决方案3】:

      Java 中没有任何等价物。您可以做的最接近的事情是声明一个 Object 类型的变量,但是您必须将该变量强制转换为您期望的任何内容,以便在其上调用 Object 未实现的任何方法(或使用反射,但这很慢)。

      Java 是一种强类型语言。我认为下一个版本将会有一些动态类型,以允许闭包,但那是明年或更可能是 2012 年。

      在 Groovy 中,您可以只使用“def”来声明没有类型的变量,并且类型将在运行时解析。并且可以将 Groovy 代码编译成 Java 字节码...

      【讨论】:

      • 闭包与动态类型有什么关系?
      • 可能没什么...我想这取决于实施。使用 Groovy 作为参考,您可以使用“def myvar”声明某些内容并为其分配任何内容(包括闭包)。我想你可以在 Java 中使用 Closure 类型,但如果我们也有动态类型,那不是更灵活吗?
      • @Chochos 我知道这已经晚了 3 年——但对于闭包,在 C# 中实现的不是动态类型——而是类型推断。
      【解决方案4】:

      您还可以包含不需要显式类型声明的 Scala 代码。 Scala 生成 Java 字节码。我没有用过C#,所以恐怕我不能把这个评论带到直接回答这个问题的地步。也许其他人可以添加它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多