Вопрос не совсем понятен.
Более корректная обобщённая реализация класса выглядит следующим образом:
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
, однако названия классов интернированы по умолчанию в пуле строк, поэтому их можно сравнивать при помощи оператора равенства.