static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
に文字列のArrayListのオブジェクトを渡すことで、シリアライズ推測ありません。コンパイラがエラーを投げています。はなぜJavaは、一般的な方法
JavaがSerializableに推論する理由を理解してもらえますか?
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
に文字列のArrayListのオブジェクトを渡すことで、シリアライズ推測ありません。コンパイラがエラーを投げています。はなぜJavaは、一般的な方法
JavaがSerializableに推論する理由を理解してもらえますか?
a1
として、あなたはタイプString
の"d"
を渡しています。引数a2
としてnew ArrayList<String>()
ArrayList<String>
を渡している、文字列とのArrayListの最寄りの共通スーパータイプはSerializable
です。あなたが書いた場合 また働くだろう:
Object s = pick("d", new ArrayList<String>());
を機能で結果を選ぶA1とA2をパラメータとして同じ型を持っています。 2行目のJavaコンパイラは、両方の引数に対して共通タイプT1を推測しようとします。a1およびa2です。関数呼び出しの結果はT1となります。 だから、A1はArrayListのを入力した文字列とA2を入力しています。どちらのタイプも、インタフェースSerializableを実装しています。したがってT1はから継承可能となり、のシリアル化可能を2行目の先頭に書くことができます。 文字列が文字列とArrayListのの両方に共通のスーパータイプではないので あなたはそこ文字列を書き込むことはできません。
ありがとうございます。これは、Stringクラスが標準javaパッケージでSerializableインターフェイスを実装していることを意味しますか?クラスAとクラスBの両方が共通のインターフェースを実装しているので、Java推論アルゴリズムはこのように動作しますか?次に、上記のsceanrioに対して戻り値の型はCですか? – user35253