Можно 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 и boost заполнены таким кодом, как
typedef T value_type;
typedef T* iterator;
и мне интересно, поддерживает ли Java подобную универсальную идиому программирования.
Я по-прежнему заинтересован в ответе, даже если перенаправление типов не может быть сделано во время компиляции.
редактировать
Вопрос (как сделать нетривиальное общее программирование на Java) не вызывает интереса у тех, кто знаком с Java. Я сейчас добавляю «C ++» в качестве тега.
Вы можете сравнить классы с:
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
это позволяет вам использовать одно имя типа в качестве псевдонима для другого.
Программа 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 они определяются во время выполнения.
Лучший ответ, который решает эту проблему, приветствуется.