Правильно ли я понимаю класс и тип Java?

#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. Позиция (1) type User
  2. Position (2) — это конструктор class User
  3. Позиция (3) type User
  4. Позиция (4) type User
  5. Позиция (5) class User
  6. Позиция (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)
 
  1. Это тип объявления переменной типа User
  2. Это тип определения переменной типа User (не конструктора, конструктор может существовать только в подклассе User)
  3. Это тип объявления параметра / аргумента типа User
  4. Это универсальный тип User определения универсального конструктора по умолчанию типа Dao
  5. Это ссылка на класс данного типа User .
  6. Это приведение к типу User .
  7. Это вызов конструктора по умолчанию типа / класса 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() создает новый экземпляр type User ; этот экземпляр присваивается ссылке 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. Посмотрите на его список внизу вопроса.