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 ++”作为标签。
答案 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版本中,它们是在运行时确定的。
非常欢迎更好的答案来解决这个问题。