2013-10-08 3 views
0

Я должен знать, возможно ли иметь оператор if в методе, который будет проверять тип используемого общего типа. В случае, когда я подумал об этом, я хочу обработать довольно простой класс Point2D и класс Point3D по-разному. В случае 3D точки мне нужно получить доступ к Point3d.z, и я не уверен, действительно ли это приведет к ПРОБЛЕМАМ версии псевдо-кода, что я хотел бы сделать, этоПроверка типов в общем методе

public <T> void processPoints(T point) { 
    process(point.x); 
    process(point.y); 
    if (T == Point3D) { // What do I do here? 
     process(point.z); // Will accessing z cause problems? 
    } 
} 

В действительности код process представляет намного сложнее, и z зависит от x и y, поэтому я ищу способ избежать дублирования кода. Вероятно, я смогу найти способ перегрузить функцию, но мне любопытно, поэтому я могу узнать больше о дженериках.

+1

(Это канонический пример не как отношения «есть-а». 3D-точка не является точкой 2D-точки.) –

ответ

3

Я должен знать, возможно ли иметь оператор if в методе, который будет проверять тип используемого общего типа.

В общем, нет - из-за Тип стирания. В принципе, тип T не известен во время выполнения.

Вы могли бы использовать:

if (point instanceof Point3D) 

, но это не совсем такой же, как проверки, является ли T сам Point3D. Это, вероятно, лучше, хотя:

public void processPoints(Point point) { 
    process(point.x); 
    process(point.y); 
    if (point instanceof Point3D) { 
     Point3D point3d = (Point3D) point; 
     process(point3d.z); 
    } 
} 
1

Нет, это не возможно, из-за type erasure во время выполнения. JVM (почти) ничего не знает о дженериках, они в основном предназначены для компилятора для проверки типов. После проверки типов с использованием генерических компиляторов компилятор заменяет на все родовые типы, скажем List<String> после компиляции становится , поэтому его нельзя обнаружить во время выполнения.

5

Как насчет простой старой перегрузки и избежать дженериков?

public void processPoints(final Point2D point) 
{ 
    process(point.x); 
    process(point.y); 
} 

public void processPoints(final Point3D point) 
{ 
    process(point.x); 
    process(point.y); 
    process(point.z); 
} 

Если у вас есть только экземпляры Point2D и Point3D почему бы вам использовать общий параметр T?

Вы должны искать другие способы удаления дублирования кода вместо использования instanceof или тому подобного.

+0

Вот как я закончил ее кодирование, но мне действительно было любопытно, как дженерики Работа. – Danny

Смежные вопросы