2010-10-14 65 views
7

我來自c#的世界。Java相當於C#動態類類型?

在C#

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

這讓我沒有使用模板/通用類,但實現certian情況下,一個simliar的感覺。

我在互聯網搜索中一直不成功,不幸的是'動態'和'java'關鍵字在動態架構上出現了很多無關的信息。

我在javaFX中涉獵了一下,並且有一個var類似於c#的動態使用。但是它似乎不適用於Java。

感謝, 斯蒂芬妮

+2

我很好奇你是如何在C#中使用它的。這聽起來像你正在使用它來轉義靜態類型安全,這在C#**或** Java中都不是一個好主意。 – 2010-10-14 17:33:45

回答

12

Java不支持動態類型,但您可以使用Java中的動態代理模擬類似的內容。首先,您需要聲明的接口與要調用你的對象的操作:

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

MyHandler的地方是聲明如下:

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

上myObjectInstance然後創建代理動態調用

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語言中。

3

有沒有像在Java中

3

沒有什麼相當於在Java中。你可以做的最接近的事情是聲明一個Object類型的變量,但是你必須將這個變量轉換爲你所期望的任何變量,以便調用它沒有被Object實現的任何方法(或者使用反射,但是這是很慢的)。

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

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

+2

閉包與動態類型有什麼關係? – 2010-10-14 17:57:56

+0

也許沒什麼......我想這取決於實施。使用Groovy作爲參考,可以使用「def myvar」聲明某些內容併爲其分配任何內容(包括閉包)。我想你可以在Java中使用Closure類型,但是如果我們也有動態類型的話,它會不會更靈活? – Chochos 2010-10-14 18:04:17

+0

@Chochos我知道這是遲了3年 - 但對於閉包而言,在C#中實現的不是動態類型 - 它是類型推斷。 – 2013-12-02 19:42:23

0

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