java如何识别两个对象的类型相同

时间:2017-08-13 09:22:20

标签: java android oop polymorphism type-safety

例如,为了数据安全,我创建了一个类,例如ModelClass,并定义了一些属性和方法,并定义了一些类似的列表 private List<ModelClass> results;那么java将如何知道我传递的内容实际上是ModelClass,它是否比较了ModelClass的所有方法和属性以及我在结果中传递的对象,我就是java如何确定2个对象是相同类型的比较所有字段和方法,以确认它们是相同的类型,

是的我知道当我定义类型时它们是相同类型会有相同的对象是方法但是当我们将对象作为多态对象传递时会发生什么

当我在学习改造时,我从这里得到了这种感觉,当我们得到回应的时候进行改造:

public void onResponse(Call<MoviesResponse>call, Response<MoviesResponse> response) {
            List<Movie> movies = response.body().getResults();
            Log.d(TAG, "Number of movies received: " + movies.size());
        }

MovieResponse具有相同的字段名称,响应对象返回here

4 个答案:

答案 0 :(得分:0)

每个对象都有一个确切的类的记录,通过调用所述对象上的getClass()方法可以看到它。这包括类的全名(包括包),以及有关字段,方法,超类,接口等的信息。

在您的情况下,它真正做的就是比较这些Class个对象以确保它们兼容。

答案 1 :(得分:0)

进行最多类型检查的组件是Java编译器,它具有完整的源代码,因此它可以简单地检查声明了哪些类型变量。 (对于某些库,您可能没有源代码,但类文件也包含此类型信息。)

例如,在代码段

public void add(ModelClass a) {
    results.add(a);
}

编译器知道results是对List<ModelClass>的引用,而a是对ModelClass的引用,因为这是它们在源代码中的定义方式。因此它接受此代码有效。在运行时,在这种情况下不需要执行类型检查。

在某些情况下,特别是当您使用instanceof运算符或显式强制转换时,JVM必须在运行时执行类型检查。为此,每个Java对象都知道自己的类。您可以通过调用其getClass()方法来获取对象的类。

请注意,编译器会检查已定义的变量类型,而在运行时会检查对象的类型(编译器无法知道)。后者始终是前者的子类型。此外,由于历史原因,在运行时通用类型信息将丢失。因此results.getClass()将返回ArrayList.class(或其他List实施),而不是List<ModelClass>.class(或类似内容)。

答案 2 :(得分:0)

要了解这个过程,您需要了解两件事: 如何获取给定对象的类信息以及如何比较这两个部分。

那么java实际上如何知道对象类?

在运行时,类与其他所有类相同。每个公共对象都存储对类对象的引用。每个班级都会存储对它的超类的引用。

要在 List<Movie> 中存储对象,对象类型应该直接Movie,或者它可能是它的后继者。 有两个课程,你怎么说如果一个是相同的或至少是另一个的继承者?

运营商instanceof,那是怎么回事!

final Movie a = new Movie(...);
final String b = "Not a Movie";

a instanceof Movie; // expression is true
b instanceof Movie; // false

我们假设你有类层次结构

Object(0) - &gt; Video(1) - &gt; Movie(2) - &gt; HollywoodMovie(3)

和代码

final HollywoodMovie a = new HollywoodMovie(...);
a instanceof Video; // true, how it works?

第二行instanceof将执行以下步骤:

  1. 检查a的类型是否在类层次结构中至少有两个节点(因为Video在其自身的层次结构中排名第二)
  2. 如果之前为真,则检查第二个节点是否为Video
  3. 这是instanceof工作

    的近似值

答案 3 :(得分:-1)

我认为,当您将一个对象添加到List&lt; ModelClass &gt;时结果,第一个操作是类型检查,如if(object instanceof ModelClass){...}