2016-05-17 4 views
-1

Я пишу универсальную утилиту сравнения, она должна быть безопасной по типу. Идея состоит в том, чтобы предотвратить сравнение разных объектов класса. Например, это работает ОК:Параметр типа Java в статическом методе времени компиляции

UtilityClazz.<String>compare("dd", 1); //OK - compile time error 

Есть ли более элегантный способ вызова класса Utility, который имеет параметр типа. Это ниже не в порядке, потому что он будет сравнивать даты и ИНТ

compare(SomeObject.getDate(), 1); //NOT OK - compiles OK no type is passed 

Метод Код:

public static<T> int compare(T value1, T value2) { 
    if (value1 instanceof Time && value2 instanceof Time) { 
     return DateComparator.compareTimes((Time) value1, (Time) value2); 
    } else if (value1 instanceof Date && value2 instanceof Date) { 
     return DateComparator.compareDates((Date) value1, (Date) value2); 
    } else if (value1 instanceof Number && value2 instanceof Number) { 
     return NumberUtility.compare((Number) value1, (Number) value2); 
    } else { 
     //.... 
     return 0; 
    } 

} 

}

Как сделать вызов метода элегантны, как это возможно?

+0

Этот ответ может быть полезен: http://stackoverflow.com/questions/16069106/how-to-compare-two-java-objects –

+0

сначала удалите это ** ** из _UtilityClazz. сравнить («dd», 1); _ – emotionlessbananas

+0

См. Https://github.com/jeevatkm/generic-repo/blob/master/genericComparator/src/main/java/com/myjeeva/comparator/GenericComparator.java –

ответ

1

Вы можете сделать его проще с перегрузкой метода, а не с дженериков:

public static int compare(Time value1, Time value2) { 
    return DateComparator.compareTimes(value1, value2); 
} 

public static int compare(Number value1, Number value2) { 
    return NumberUtility.compare(value1, value2); 
} 

Это устраняет ненужные instanceof проверки и дает некоторые гарантии компиляции типа времени.

0

Это один вы проверили общий тип, как String и оленья кожа компиляции, потому что 1 не String:

UtilityClazz.<String>compare("dd", 1); 

но ниже вы не проверить общий тип, и автоматически компилятор проверяет его как Object и Object тип передается ,

compare(SomeObject.getDate(), 1); 

Вы должны добавить Object случай к вашему сравнить метод

0

Вместо серии из if, вы можете сделать карту, которая связывает класс его компаратор: Map<Class<?>,Comparator<?>>. Класс доступен по методу getClass().

Если вы хотите обрабатывать полиморфизм, вам нужно будет позвонить getSuperclass() на каждый объект, пока не найдете общего предка.

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