Как компилятор понимает, где одна переменная, а где другая?

256
26 декабря 2021, 18:00
public class User {
    String name;
    short age;
    int height;
    public User(int height, short age, String name) {
        this.height = height;
        this.age = age;
        this.name = name;
    }
    public User(int height, String name, short age) {
        this.height = height;
        this.name = name;
        this.age = age;
    }
    public User(short age, String name, int height) {
        this.age = age;
        this.name = name;
        this.height = height;
    }
    public User(short age, int height, String name) {
        this.age = age;
        this.height = height;
        this.name = name;
    }
    public User(String name, int height, short age) {
        this.name = name;
        this.height = height;
        this.age = age;
    }
    public User(String name, short age, int height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public static void main(String[] args) {
        User user1 = new User("Dminem", (short)28, 182);
        User user2 = new User("Nemdim", 160, (short)32);
        System.out.println(user1.name + user1.height + user1.age);
        System.out.println(user2.name + user2.height + user2.age);
    }
}

Почему если при создании объектов указать перед значением (short), то компилятор понимает, в какую переменную записать это значение?

Почему такой же фокус не проходит, если указать (int) перед другим значением?

Answer 1

Если делать так:

User user1 = new User("Dminem", 28, (int)182);

Или так

User user1 = new User("Dminem", 28, 182);

то в конструктор передаются два int. А конструктора для таких параметров нет. Потому фокус и не удается.

Предположим у нас есть два таких конструктора (и компилятор разрешает):

public User(int height, int age) {
        this.height = height;
        this.age = age;
    }

и

public User(int age, int height) {
        this.height = height;
        this.age = age;
    }

Теперь мы создаем такой объект

User user = new User(28, 182);

Откуда яве знать, какой конструктор здесь нужно использовать? Потому такое и невозможно.

Answer 2

а когда типы переменных будут исчерпаны?

public class Height {
  private int value;
  private Height(int value) {
    this.value = value;
  }
  public int getValue() { return value; }
  public static Height of(int value) {
    return new Height(value);
  }
}

Аналогично - для Age.

public User(String name, Height height, Age age) {
    this.name = name;
    this.height = height.getValue();
    this.age = age.getValue();
}
public User(String name, Age age, Height height) {
    this.name = name;
    this.height = height.getValue();
    this.age = age.getValue();
}
...
User user2 = new User("Nemdim", Height.of(160), Age.of(32));
User user1 = new User("Dminem", Age.of(28), Height.of(182));
READ ALSO
Swagger - ошибка пути

Swagger - ошибка пути

В Swagger есть проблема на вызов реста возвращающий List<Map<String, Object>> (вверху появляется сообщение)

139
Переход по неделям по нажатию на кнопки

Переход по неделям по нажатию на кнопки

Как сделать навигацию по неделям как на скриншоте? Нажимаем вперёд переключаемся на следующую неделю, если назад то на предыдущую?

180
Хеш-таблица с открытой адресацией

Хеш-таблица с открытой адресацией

Подскажите, как реализовать функцию удаления в хеш-таблице с открытой адресацией? Например,

66
Отправка TCP пакетов на сервер

Отправка TCP пакетов на сервер

У меня есть сервер написанный на C++, основанный на "неблокирующих сокетах с использованием select" - Пример данный реализации есть в интернете,...

150