【问题标题】:Is my understanding of Java's Class and Type correct?我对 Java 的 Class 和 Type 的理解是否正确?
【发布时间】:2014-06-23 16:22:31
【问题描述】:

在 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. 位置(2)class User的构造函数
  3. 位置(3)type User
  4. 位置(4)type User
  5. 位置(5)class User
  6. 位置(6)type User

我的理解正确吗?

【问题讨论】:

  • 真的需要区分吗?类始终是类型
  • 如果我无法弄清楚classtype 之间有什么区别,我发现很难理解subclassingsubtyping 或scala 的类型系统,以及它是什么是如果有的话。
  • @Freewind 你为什么突然谈论 Scala?
  • 如果你有User myVar = new User();,那么你的变量myVar 是用户类型,同时你可以说myVar然后指向一个 User 类的对象..但我认为没有必要为此烦恼:)
  • 一个实例可以被认为是任何时候类的快照。所以每当你看到 new() 时,我们都在谈论实例。只是一个想法

标签: java class types


【解决方案1】:

我会说:

Class cls = User.class;
            ^^^^^^^^^^(5)

User user = new User();
            ^^^^^^^^^^(7)
  1. 这是User 类型变量的声明类型
  2. 这是User类型变量的定义类型(不是构造函数,构造函数可能只存在于User的子类中)
  3. 这是User 类型的参数/参数的声明类型
  4. 这是Dao 类型的泛型默认构造函数定义的泛型类型User
  5. 这是对 User 类型的类的引用。
  6. 这是User 类型的强制转换。
  7. 这是对类型/类 User 的默认构造函数的调用。

类型或类别?每个类都可以是一个类型,但不是每个类型都可以是一个类。例如,像int 这样的原语是一种类型,而不是类。如果您是完全科学正确的,则必须指定 User 是一个类。如果你说User 是一个类型,它没有错,但也不具体。

【讨论】:

  • 我很高兴他没有问void是不是一个类型。我不知道!也许void 必须是一个类型,因为 JLS 认为它可以是规范方法声明的返回类型。
  • 其实我在这个链接上找到了Note the void indicating that the method does not actually return a result; 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() 创建了一个User 类型的新实例;该实例被分配给引用user
  • 在 (3) 中,您将向函数 saveUser 传递对 User 类型对象的引用;
  • (4)中User是类型参数,即指定Dao类参数化的对象类型;
  • 在 (5) 中,您获得了对 Class&lt;User&gt; 类型对象的引用,它代表 User 类型,它在技术上不是 @987654332 @类型;
  • 在 (6) 中,您正在添加显式类型转换,告诉编译器引用 someObj 的类型为 User,并将该引用的值分配给引用 user(其类型为 User );根据someObj 的类型,编译器可能需要也可能不需要转换,并且可能会或可能不会导致ClassCastException

【讨论】:

    【解决方案3】:

    Position (2) 表示 object 本身通过调用 constructor 实例化,不带参数。

    所有其他假设都是正确的。

    【讨论】:

      【解决方案4】:

      类是抽象数据类型的一个例子。 因此,类是一种类型,您可以无差别地将用户命名为“类”或“类型”。

      请注意,相反的情况并不总是正确的,因此类型不一定是类(例如 int float,ecc 等原始类型。)

      【讨论】:

      • 看看他在问题底部的列表。
      猜你喜欢
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2020-03-03
      • 2010-11-07
      相关资源
      最近更新 更多