Обобщённый конструктор реализация методов
Учебная задача. Прошу помощи в реализации метода. Не знаю как обратиться, чтобы получить тип полей id и number.
Создайте обобщённый конструктор, который принимает два параметра: T и V. В конструкторе необходимо сравнить классы этих двух параметров и предусмотреть соответствующий вывод результата в консоли.
public class Constructor {
private double id;
private double number;
public <T extends Number, V extends Number> Constructor(T id, V number) {
this.id = id.doubleValue();
this.number = number.doubleValue();
}
public <T, V> boolean typeCompare(Constructor obj) {
return getClass().getName() == obj.getClass().getName();
}
Ответы (2 шт):
public class Constructor {
private Number id;
private Number number;
public <T extends Number, V extends Number> Constructor(T id, V number) {
this.id = id;
this.number = number;
boolean isTheSameClass = Objects.equals(id.getClass(), number.getClass());
// output
}
}
Вопрос не совсем понятен.
Более корректная обобщённая реализация класса выглядит следующим образом:
public class Constructor<T extends Number, V extends Number> {
private T id;
private V number;
public Constructor(T id, V number) {
this.id = id;
this.number = number;
System.out.println("types of id and number: " + (id.getClass() == number.getClass()));
}
public boolean typesEqual(Constructor that) {
return id.getClass() == that.id.getClass()
&& number.getClass() == that.number.getClass();
}
}
Тест:
var c1 = new Constructor<>(11, 22L);
var c2 = new Constructor<>(33, 44);
System.out.println(c1.typesEqual(c2));
Результаты: Integer != Long; Integer == Integer
types of id and number: false
types of id and number: true
false
Однако, вполне можно проверить/сравнить тип аргументов в существующей реализации (когда сам класс Constructor не является обобщённым):
class Constructor2 {
private double id;
private double number;
public <T extends Number, V extends Number> Constructor2(T id, V number) {
this.id = id.doubleValue();
this.number = number.doubleValue();
System.out.println("types of id and number: " + (id.getClass() == number.getClass()));
}
public boolean typesEqual(Constructor2 obj) {
return getClass().getName() == obj.getClass().getName();
}
}
Здесь информация о типах в методе typesEqual утеряна, данный метод не является обобщённым и представленная реализация не имеет какого-то смысла.
var c1 = new Constructor2(11, 22L); // <> не применим, класс не обобщённый
var c2 = new Constructor2(33, 44); // <> не применим, класс не обобщённый
System.out.println(c1.typesEqual(c2));
types of id and number: false
types of id and number: true
true
Отдельно следует указать на сравнение (имён) классов при помощи оператора ==.
Известно, что строки в общем случае следует сравнивать при помощи String::equals, однако названия классов интернированы по умолчанию в пуле строк, поэтому их можно сравнивать при помощи оператора равенства.