#java #class #types
#java #класс #типы
Вопрос:
В Java, когда вы определяете класс, вы определяете тип неявно. Скажем, я определил класс User
:
class User {}
Затем мы получаем класс User
и неявный тип User
.
Когда мы используем имя User
, иногда мы ссылаемся class User
, иногда type User
. Позвольте мне привести несколько примеров:
User user = new User();
^^^^(1) ^^^^(2)
public void saveUser(User user) {
^^^^(3)
}
class Dao<T> {
def save(T t) {}
}
new Dao<User>();
^^^^(4)
Class cls = User.class;
^^^^(5)
User user = (User) someObj;
^^^^(6)
Мое понимание:
- Позиция
(1)
type User
- Position
(2)
— это конструкторclass User
- Позиция
(3)
type User
- Позиция
(4)
type User
- Позиция
(5)
class User
- Позиция
(6)
type User
Правильно ли я понимаю?
Комментарии:
1. Действительно ли нужно различать? Класс всегда является типом
2. Мне было трудно понять
subclassing
,subtyping
, или систему типов scala, если я не могу понять, есть ли какая-либо разница междуclass
иtype
, и что это такое, если есть.3. @Freewind почему ты вдруг заговорил о Scala?
4.Если у вас есть
User myVar = new User();
, то ваша переменнаяmyVar
имеет тип User и в то же время вы можете сказатьmyVar
, что then указывает на объект класса User.. Но я думаю, что нет необходимости ломать над этим голову 🙂5. Экземпляр можно рассматривать как снимок класса в любой момент. Поэтому всякий раз, когда вы видите new () , мы говорим об экземпляре. Просто мысль
Ответ №1:
Я бы сказал:
Class cls = User.class;
^^^^^^^^^^(5)
User user = new User();
^^^^^^^^^^(7)
- Это тип объявления переменной типа
User
- Это тип определения переменной типа
User
(не конструктора, конструктор может существовать только в подклассе User) - Это тип объявления параметра / аргумента типа
User
- Это универсальный тип
User
определения универсального конструктора по умолчанию типаDao
- Это ссылка на класс данного типа
User
. - Это приведение к типу
User
. - Это вызов конструктора по умолчанию типа / класса
User
.
Тип или Класс? Каждый класс может быть типом, не каждый тип может быть классом. Примитивы, такие как int
, например, это тип, но не класс. Если вы совершенны-научно-корректны, вы должны указать, что User
это Класс. Если вы говорите User
, что это тип, это не неправильно, но и не конкретно.
Комментарии:
1. Я так счастлива, что он не спросил, является ли
void
это типом. Я понятия не имею! Возможноvoid
, это должен быть тип, потому что JLS говорит, что это может быть возвращаемый тип объявления канонического метода.2. на самом деле, я нашел это
Note the void indicating that the method does not actually return a resu< void is not a type, it is an annotation on the method.
по этой ссылке: ccs.neu.edu/home/riccardo/courses/csu370-fa07/lect4.pdf
Ответ №2:
- в (1)
User
является ли типuser
ссылкой на объект этого типа; - в (2) выражение
new User()
создает новый экземпляр typeUser
; этот экземпляр присваивается ссылкеuser
; - в (3) вы передаете функции
saveUser
ссылку на объект типаUser
; - в (4)
User
указан параметр типа, то есть он указывает, с помощью какого типа объектаDao
параметризуется класс; - в (5) вы получаете ссылку на объект типа
Class<User>
, который представляет типUser
, технически это неUser
тип; - в (6) вы добавляете явное приведение типов, сообщаете компилятору, что ссылка
someObj
имеет типUser
, и присваиваете значение этой ссылки ссылкеuser
(которая имеет типUser
); в зависимости от типаsomeObj
приведения может потребоваться или не потребоваться компилятору и может вызвать или не вызватьClassCastException
.
Ответ №3:
Position (2)
представляет сам объект, созданный путем вызова constructor
без аргументов.
Все остальные предположения верны.
Ответ №4:
Класс является примером абстрактного типа данных. Итак, класс — ЭТО тип, и вы можете безразлично назвать пользователя «классом» или «типом».
Имейте в виду, что обратное не всегда верно, поэтому тип не обязательно является классом (например, примитивные типы, такие как int float , ecc).
Комментарии:
1. Посмотрите на его список внизу вопроса.