Как написать собственный метод приведения в Java - PullRequest
3 голосов
/ 06 июня 2019

У меня есть класс Java, который имеет несколько членов. Я хочу написать кастом для этого. Мне было интересно, как это можно сделать?

Предположим, что класс выглядит следующим образом:

class Person {
   private int age;
   private float weight;

   // getters and setters and etc
}

Я бы хотел, чтобы приведение int вернуло член age объекта, а приведение float вернуло weight объекта.

Например:

public class Main {
    public static void main(String[] args) {

        // create an object
        Person P = new Person();
        P.setAge(21);
        P.setWeight(88.0);

        // case 1: casting object to an existing data type
        int personAge = (int) P; // would return the age
        float personWeight = (float) P;  // would return the weight

        // case 2: casting an existing data type to an object
        Person P2 = (Person) personAge; // this would create an instance of the object whose age is assigned and weight is not assigned

    }
}

Мне было интересно, можно ли сделать обратное. В частности, приведение int к Person вернет экземпляр Person, который назначен age, и аналогично для float.

Я знаю, что на этот вопрос может не быть ответа. Но так как я не нашел полезных результатов в своем поиске, я решил спросить его.

P.S. Я понимаю, что для String метод toString позаботится о случае 1.

Ответы [ 3 ]

4 голосов
/ 06 июня 2019

Вы не можете перегрузить оператор приведения.Java не поддерживает это и, вероятно, никогда не будет.

Чтобы преобразовать одно значение в экземпляр нужного класса, мы используем статические фабричные методы.

public static Person fromAge(int age) {
    return new Person(age);
}

Они частовернуть частично построенный объект.В приведенном выше фрагменте у недавно созданного человека установлено только age: для других полей будут заданы значения по умолчанию.

Для обратного мы используем геттеры.

public int getAge() {
    return age;
}

Однако, поскольку toString уже существует, имеет смысл добавлять и другие типы данных.

toInt не имеет смысла, когда он применяется ко мне (как примерPerson класс).Это может быть мой рост, мой вес, мой возраст, количество раз, когда я сегодня ходил в ванную, и т. Д. Я не могу представить себя одним целым числом, как и большинство классов.

С другой стороны, toString может выполнять эту работу довольно хорошо: я могу дать вам (читай return ) краткую информацию о моих хобби, моей биометрической информации, даже моей фотографии.Или я могу оставить это для реализации по умолчанию, которая все еще удовлетворительно представляет объект.

0 голосов
/ 06 июня 2019

Так что я сделал это только один раз, и я не уверен, является ли подход, который я использовал, подходящим.

Но мой подход был методом под названием typeConverter, который я бы дал object как parameter, тогда вы можете взять это parameter и посмотреть, какой это тип объекта, а затем создать нового персонажа с вашим значением.

Хотя этот подход может вызвать проблемы, когда ваш класс будет иметьдва integer fields.Но я думаю, что вы могли бы найти решение для этого, предоставив ему другой параметр, который определяет, в какое поле вы хотите его преобразовать.

Мне очень жаль моего плохого английского, но я надеюсь, что выполучить принцип.

0 голосов
/ 06 июня 2019

Вы не использовали бы приведение для этого, просто напишите методы в своем классе Person для получения этих значений.

public int getAge()
{
  return age;
}

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...