Подтвердить что ты не робот

Почему бы не использовать Object для всех параметров метода?

public class helloworld {
    public static void main(String[] args) {
        String text = "Hello World";
        l(text);
        int n = 0;
        l("--------------------------");
        l(n);   
    }

    public static void l(Object obj) {
        System.out.println(obj);
    }
}

Я написал эту простую программу на Java, и она сработала. Теперь я смущен, что если все типы данных (int, char, double и т.д.) Попадают под Object, то почему мы указываем, какой тип данных мы хотим принять при передаче значений?

Я имею в виду, что мы всегда можем использовать тип данных Object, используемый в функции l. Существует ли конкретная причина, по которой люди не всегда используют Object в качестве своего типа данных для передачи значений?

4b9b3361

Ответ 1

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

int -> Integer
char -> Character
etc...

Это называется autoboxing.

Существует ли конкретная причина, по которой люди не всегда используют "Объект" в качестве своего типа данных для передачи значений?

Так как Java строго типизирован, вы не можете много сделать с Object.

например. попробуйте следующее:

static Object add(Object a, Object b) {
    return a + b; // won't compile
}

Это связано с тем, что используемые методы, операторы и т.д. зависят от статического типа переменной.

println может принимать Object, потому что ему нужно только вызвать метод toString. Если вам нужна только ограниченная функциональность, предоставляемая методами в Object, то обязательно, вы можете использовать ее как тип. Однако это редко бывает.

Ответ 2

Для примитивов, о которых вы упомянули, они не являются объектами, они просто будут помещены в их представление как объект. int станет Integer, a long станет long и т.д.

Прочитайте эту статью о Autoboxing в java.

Что касается вашего вопроса

Существует ли конкретная причина, почему люди не всегда используют "объект" как их тип данных для передачи значений?

Если вы укажете Object в качестве параметра вашего метода, вы не сможете вызвать методы, которые содержит настоящий объект, не делая приведение. Например, если у вас есть пользовательский объект AnyObject, который содержит метод anyMethod, вы не сможете вызвать его, не подвергая объект AnyObject.

Он также будет небезопасным, поскольку вы сможете передать любой тип объекта методу, который не может быть разработан для правильной работы с любым из этих типов. Метод, содержащий только System.out.println, не является репрезентативным для реального использования, он будет работать с любым объектом просто потому, что по умолчанию println вызовет метод toString, который уже определен в Object.

Ответ 3

Пока он выглядит как функция, которая, как представляется, принимает все типы параметров, вам придется иметь дело с этими

  • Сигнатура функции становится менее информативной.
  • Больше не перегружать
  • Вам нужно сделать много проверок и литье типов в тело функции, чтобы избежать ошибок времени выполнения.
  • Хотя метод, по-видимому, принимает все объекты, вы никогда не узнаете фактическое их подмножество, пока не увидите определение метода.
  • Тело функции может содержать больше кода для устранения неправильных типов, чем для его реальной цели. Например, ваша функция только печатает значение. Представьте себе функцию, которая преимущественно выполняет целую операцию.
  • Увеличивает вероятность ошибок во время выполнения, поскольку компилятор не может вызывать ошибки для отсутствующих трансляций.