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

2022-09-03 01:29:58

我来自c#的世界。

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

这使我不必使用模板化/泛型类,而是在某些情况下实现模拟感觉。

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

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

谢谢 斯蒂芬妮


答案 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中没有这样的东西