在Java中模拟C ++ - typedef

时间:2012-11-09 02:36:18

标签: java c++ generics introspection

typedef FooBar Bar;可以通过代码中的Foo::Bar表达式访问FooBar类型

#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和boost充满了诸如

之类的代码
typedef T              value_type;
typedef T*             iterator;

我想知道Java是否支持类似的通用编程习惯用法。 即使在编译时无法完成类型间接,我仍然对答案感兴趣。

修改 问题(如何在Java中进行非平凡的通用编程)并没有引起那些熟悉Java的人的兴趣。我现在正在添加“C ++”作为标签。

2 个答案:

答案 0 :(得分: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这样的内容,允许您使用一个类型名称作为另一个类型的别名。

答案 1 :(得分: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版本中,它们是在运行时确定的。

非常欢迎更好的答案来解决这个问题。