2017-08-13 7 views
1

たとえばデータの安全性についてクラスを作成し、ModelClassなどのクラスを作成し、いくつかのプロパティとメソッドを定義し、そのようなリストを定義します private List<ModelClass> results;次に渡すものがJava実際のModelClassは、ModelClassのすべてのメソッドとプロパティを比較し、結果に渡すオブジェクトは何ですか?私はJavaが2つのオブジェクトが同じ型であると判断する方法です。同じタイプ、Javaが両方のオブジェクトの型が同じであることを認識する方法

はい、私は型を定義するとき、彼らは同じ種類のものであることを知っているが、同じオブジェクトがメソッドですが、我々は多型のオブジェクト

としてオブジェクトを渡すとき、何が起こるだろう我々はそのようなレスポンスを得るとき、私は改造で、改造を学んでいたとき

私はここからこの感覚を得た:

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

+0

「ダックタイピング」と記述します。 Javaは静的型付けを使用します。オブジェクトはどのクラスであるかを知っていて、クラスのスーパータイプはObjectまであり、必要な型は実装されているインタフェースの1つでなければなりません。 –

答えて

0

すべてのオブジェクトがレコードを持っている同じフィールド名を持ちますそれはあなたが上記のオブジェクトのgetClass()メソッドを呼び出すことによって見ることができます。これには、クラス(パッケージを含む)のフルネーム、フィールド、メソッド、スーパークラス、インターフェースなどの情報が含まれます。

あなたのケースでは、これらのオブジェクトを実際に比較して確認します彼らは互換性があります。

+0

私はクラスAを定義し、名前、年齢、国籍などのフィールドを定義してそのオブジェクトを作成し、同じフィールドを持つ他のオブジェクトを割り当て、名前、年齢、国籍をクラスAにコピーしますオブジェクト? – blackHawk

+0

updated私の質問 – blackHawk

+0

今説明した内容はコンパイルされません。 'A'と同じフィールドを持つという理由だけで、' A'と同じメソッドは必ずしも 'A'にするわけではありません。 Javaはコンパイル時にこのような試みを拒否します。 –

-1

私はあなたが< ModelClass>結果に一覧にを一つのオブジェクトを追加するとき、最初のアクションはほとんどの型チェックを行うコンポーネントはJavaコンパイラであるif(object instanceof ModelClass){...}

+0

更新された質問 – blackHawk

+0

いいえそれはありません。コンパイル時のチェックがあります。 – EJP

0

のような型チェックであり、それ、考えますその完全なソースコードを自由に使えるので、どの型変数が宣言されたかを簡単に確認できます。 (いくつかのライブラリのためには、ソースコードを持っていないかもしれませんが、また、クラスファイルは、このタイプの情報が含まれています。)例えば

、コードスニペットに

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

コンパイラはresultsがへの参照であることを知っていますそれは、それらがソースコードで定義される方法であるためList<ModelClass>aことは、ModelClassへの参照です。したがって、このコードは有効です。実行時には、この場合にタイプ・チェックを実行する必要はありません。あなたがinstanceofオペレータまたは明示的なキャストを使用する場合、いくつかのケースでは

は、具体的には、JVMは、実行時に型チェックを実行する必要があります。このために、すべてのJavaオブジェクトはそれ自身のクラスを知っています。オブジェクトのクラスは、getClass()メソッドを呼び出すことで取得できます。実行時にオブジェクトの型は(コンパイラが知ることができない)がチェックされるのに対し、コンパイラは、変数の定義されたタイプをチェック

注意。後者は常に前者のサブタイプです。さらに、歴史的な理由から、実行時にはジェネリック・タイプの情報が失われます。だから、results.getClass()List<ModelClass>.class(またはそのような何か)、ArrayList.class(または別のList実装)ない返します。指定されたオブジェクトとどのようにこれらの2枚を比較することのクラス情報を取得する方法 :あなたは二つのことを知っておく必要があり、そのプロセスを理解することが

0

Javaは実際にオブジェクトクラスをどのように知っていますか?

ランタイムクラスでは、他のすべてと同じオブジェクトです。すべての共通オブジェクトには、クラスオブジェクトへの参照が格納されます。また、すべてのクラスにはスーパークラスへの参照が格納されています。オブジェクト・タイプが直接Movieなければならないか、それが後継者だとすることができるList<Movie>でオブジェクトを格納するために

。 2つの授業を持っているのは、ある人が同じ人であるか、少なくとも後者の後継者であるかをどう思いますか?

オペレータinstanceofです。 >Video(1) - - >Movie(2) - >HollywoodMovie(3)

とコード

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

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

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

あなたはクラス階層

Object(0)を持っているとしましょう

2行目のinstanceofは、次の手順で行います。

  1. チェック(Videoはそれ自身の階層に第二あるため)第2のノードがVideo

これはある場合に以前は真チェック場合aのタイプは、クラス階層で

  • を少なくとも二つのノードがある場合近似のinstanceofの作業

  • 関連する問題