Почему бы не использовать 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
в качестве своего типа данных для передачи значений?
Ответы
Ответ 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
Пока он выглядит как функция, которая, как представляется, принимает все типы параметров, вам придется иметь дело с этими
- Сигнатура функции становится менее информативной.
- Больше не перегружать
- Вам нужно сделать много проверок и литье типов в тело функции, чтобы избежать ошибок времени выполнения.
- Хотя метод, по-видимому, принимает все объекты, вы никогда не узнаете фактическое их подмножество, пока не увидите определение метода.
- Тело функции может содержать больше кода для устранения неправильных типов, чем для его реальной цели. Например, ваша функция только печатает значение. Представьте себе функцию, которая преимущественно выполняет целую операцию.
- Увеличивает вероятность ошибок во время выполнения, поскольку компилятор не может вызывать ошибки для отсутствующих трансляций.