Java相当于C#动态类类型吗?

发布于 2024-09-28 04:13:06 字数 376 浏览 3 评论 0原文

我来自 c# 世界。

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

这使我不必使用模板/通用类,但可以在某些情况下获得类似的感觉。

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

我在 javaFX 中涉足了一些,并且有一个 var 类型,它似乎与 c# 的动态具有相同的用法。但它似乎不能在 Java 中使用。

谢谢, 斯蒂芬妮

I'm coming from the world of c#.

in C# i am able to use the class dynamic http://msdn.microsoft.com/en-us/library/dd264741.aspx

This allows me to not have to use templated/generic classes but achieve a simliar feel for certian situations.

I'm have been unsuccessfull in internet searchs as unfortunately 'dynamic' and 'java' keywords turn up alot of unrelated infromation on dynamic architectures.

I have dabbled a bit in javaFX and there is a type var which appears to have the same usage as c#'s dynamic. However it doesnt appear to be usable in Java.

thanks,
stephanie

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

涙—继续流 2024-10-05 04:13:07

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 语言中公开。

Java doesn't support dynamic typing, but you can simulate something like that using dynamic proxy in Java. First you'll need to declare an interface with operations you want to invoke on your objects:

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

Then create Proxy for dynamic invocation on myObjectInstance:

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

where MyHandler is declared like this:

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);
  }
}

so, if myObject has methods foo() and boo(), they will be invoked, or else, you'll get a RuntimeException.

There is also number of languages that can run in JVM support dynamic typing, e.g. Scala, Groovy, JRuby, BeanShell, JavaScript/Rhino and many others. There is some JVM changes are coming in Java 7 to support a native dynamic dispatch, so these languages could perform much better, but such feature won't be directly exposed in statically typed Java language.

等待我真够勒 2024-10-05 04:13:07

Java 中没有类似的东西

There is nothing like that in Java

神经暖 2024-10-05 04:13:07

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

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

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

There's nothing equivalent in Java. The closest thing you could do is declare a variable of type Object but then you have to cast that variable to whatever you're expecting in order to invoke any method on it that's not implemented by Object (or use reflection but that's sloooow).

Java is a strongly typed language. I think for the next version there will be some dynamic typing, to allow for closures, but that's next year or more probably 2012.

In Groovy you can just use "def" to declare a variable without a type, and the type will be resolved at runtime. And you can compile the Groovy code to Java bytecode...

无人问我粥可暖 2024-10-05 04:13:07

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

You can also include Scala code, which does not require explicit type declarations. Scala produces Java byte code. I haven't used C#, so I'm afraid I can't take this comment to the point of responding directly to the question. Maybe someone else can add to it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文