2017-12-22 7 views
3
  1. static <T> T pick(T a1, T a2) { return a2; }
  2. Serializable s = pick("d", new ArrayList<String>());

に文字列のArrayListのオブジェクトを渡すことで、シリアライズ推測ありません。コンパイラがエラーを投げています。はなぜJavaは、一般的な方法

JavaがSerializableに推論する理由を理解してもらえますか?

答えて

8
  • 引数a1として、あなたはタイプString"d"を渡しています。引数a2として
  • あなたがタイプのnew ArrayList<String>()ArrayList<String>

を渡している、文字列とのArrayListの最寄りの共通スーパータイプはSerializableです。あなたが書いた場合 また働くだろう:

Object s = pick("d", new ArrayList<String>()); 
+0

ありがとうございます。これは、Stringクラスが標準javaパッケージでSerializableインターフェイスを実装していることを意味しますか?クラスAとクラスBの両方が共通のインターフェースを実装しているので、Java推論アルゴリズムはこのように動作しますか?次に、上記のsceanrioに対して戻り値の型はCですか? – user35253

0

を機能結果を選ぶA1A2をパラメータとして同じ型を持っています。 2行目のJavaコンパイラは、両方の引数に対して共通タイプT1を推測しようとします。a1およびa2です。関数呼び出しの結果はT1となります。 だから、A1ArrayListのを入力した文字列A2を入力しています。どちらのタイプも、インタフェースSerializableを実装しています。したがってT1から継承可能となり、のシリアル化可能を2行目の先頭に書くことができます。 文字列文字列ArrayListのの両方に共通のスーパータイプではないので あなたはそこ文字列を書き込むことはできません。

関連する問題