2012-11-09 49 views
1

typedef FooBar Bar;並在代碼模擬C++ - 用Java

#include <typeinfo> 
#include <iostream> 

class FooBar {}; 
class FooBat {}; 

class Foo 
{ 
public: 
    typedef FooBar Bar; 
    typedef FooBat Bat; 
}; 

int main() 
{ 
    if(typeid(Foo::Bar) == typeid(FooBar) && 
     typeid(Foo::Bat) == typeid(FooBat)) 
     std::cout << "All is well." << std::endl; 
} 

的訪問類型FooBar的通過表達Foo::Bar的typedef被翻譯成Java?

對於類型的間接引用,Java的等價物是什麼?

的STL和提升都充滿了這樣的代碼

typedef T    value_type; 
typedef T*    iterator; 

我想知道的Java是否支持類似的泛型編程成語。 即使類型間接不能在編譯時完成,我仍然對答案感興趣。

編輯 這個問題(如何在Java中進行非平凡的泛型編程)沒有得到那些熟悉Java的熟悉者的興趣。我現在添加「C++」作爲標籤。

+0

也許這會幫助http://stackoverflow.com/questions/1195206/is-there-a-java-equivalent-or-methodology-for-the-typedef-keyword-in-c – lawrencexu

回答

1

在問題中的C++程序轉換爲下面的Java代碼:

public class FooBat {} 
public class FooBar {} 

public class Foo { 
    public static Class get_Bar() { return FooBar.class; } 
    public static Class get_Bat() { return FooBat.class; } 
} 

public class Introspect { 
    public static void main(String[] args) { 
     if(Foo.get_Bar() == FooBar.class && 
      Foo.get_Bat() == FooBat.class) 
      System.out.println("All is well.\n"); 
    } 
} 

這不是作爲C++代碼那樣高效。編譯期間,類型由C++版本確定。在Java版本中,它們是在運行時確定的。

解決此問題的更好的答案是非常受歡迎的。

+0

你想用這個代碼來完成什麼? –

+0

假設你正在實現一個圖類。你希望它被一個頂點和一個邊緣參數化,但你不希望只有任何一對類被允許。所以你寫了一個充當圖形特徵的類(如Foo)。條和蝙蝠是通用頂點和邊。代替Introspect,我們將有一個(更長的)類使用兩個實際的類FooBat和FooBar。 – Calaf

2

你可以用比較類:

Object a = . . .; 
Object b = . . .; 
if (a.getClass().equals(b.getClass())) { 
    // a and b are instances of the same class 
} 
if (a.getClass().isAssignableFrom(b.getClass())) { 
    // the class of a is a superclass of b's class 
} 

然而,Java沒有像typedef東西,可以讓你使用一種類型的名稱作爲另一個別名。

+0

方法get_bar()和get_bat()是我希望Java如何促進泛型編程的一個例子。你可以看看Foo的班級並對其進行評論嗎? – Calaf