Обобщённый конструктор реализация методов

Рейтинг: -1Ответов: 2Опубликовано: 12.04.2023

Учебная задача. Прошу помощи в реализации метода. Не знаю как обратиться, чтобы получить тип полей 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();
    }

Ответы

▲ 1Принят

Вопрос не совсем понятен.

Более корректная обобщённая реализация класса выглядит следующим образом:

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

▲ 0
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
     }
}