Имитация C ++ — typedefs в Java

Можно 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 ++» в качестве тега.

1

Решение

Вы можете сравнить классы с:

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 это позволяет вам использовать одно имя типа в качестве псевдонима для другого.

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 они определяются во время выполнения.

Лучший ответ, который решает эту проблему, приветствуется.

2

По вопросам рекламы [email protected]