簡體   English   中英

Java相當於C#動態類類型?

[英]Java equivalent to C# dynamic class type?

我來自c#的世界。

在C#我能夠使用類動態http://msdn.microsoft.com/en-us/library/dd264741.aspx

這使我不必使用模板化/泛型類,而是為certian情境實現類似的感覺。

我在互聯網搜索方面一直沒有成功,因為不幸的是“動態”和“java”關鍵詞在動態架構上出現了很多不相關的信息。

我在javaFX中涉足了一點,並且有一個類型var似乎與c#的動態具有相同的用法。 但它似乎不適用於Java。

謝謝,斯蒂芬妮

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中沒有類似的東西

Java中沒有任何等價物。 你可以做的最接近的事情是聲明一個Object類型的變量,但是你必須將該變量強制轉換為你期望的任何變量,以便調用它上面沒有被Object實現的任何方法(或者使用反射,但是這是sloooow)。

Java是一種強類型語言。 我認為對於下一個版本會有一些動態類型,以允許關閉,但這可能是明年或更多可能2012年。

在Groovy中,您可以使用“def”來聲明沒有類型的變量,並且類型將在運行時解析。 您可以將Groovy代碼編譯為Java字節碼...

您還可以包含Scala代碼,該代碼不需要顯式類型聲明。 Scala生成Java字節代碼。 我沒有使用C#,所以我擔心我不能把這個評論直接回答這個問題。 也許其他人可以添加它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM