1

コード内typedef FooBar Bar;の式を介して型 FooBar にアクセスできますFoo::Bar

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

Javaに翻訳されますか?

型への間接参照に相当する Java は何でしょうか?

STL とブーストは、次のようなコードで満たされています。

typedef T              value_type;
typedef T*             iterator;

Javaが同様の汎用プログラミングイディオムをサポートしているかどうか疑問に思っています。コンパイル時に型の間接化を行うことができない場合でも、回答に興味があります。

編集 質問 (Java で重要なジェネリック プログラミングを行う方法) は、Java に精通している人々から関心を集めていません。現在、「C++」をタグとして追加しています。

4

2 に答える 2

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
}

typedefただし、Java には、ある型名を別の型名のエイリアスとして使用できるようなものはありません。

于 2012-11-09T02:39:30.223 に答える
2

問題の 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 バージョンでは、実行時に決定されます。

この問題を解決するより良い答えは大歓迎です。

于 2012-11-26T21:35:46.680 に答える