初めての質問です。よろしくおねがいします。
知りたいこと
添付のソースコードで、「map3 = map1」がコンパイルエラーになります。
やりたいことを実現する解決策はあるのですが、
そもそも、これをコンパイルエラーで弾く理由がわからなくて困っています。
特化型のオブジェクトは、
インタフェースや継承元クラスのインタフェースでアクセスする場合、
インタフェースや継承元クラスの型の変数に保持できます。
(「これは出来る」の部分が該当)
この考えで、「map3 = map1」を弾く理由が理解できません。
何か、腑に落ちる理由があると思っています。
該当のソースコード
java
1import java.util.HashMap; 2import java.util.Map; 3 4public class TestTypeParameter { 5 6 public static void main(String[] args) { 7 Child child = new Child(); 8 Parent parent = child; // これは出来る。 9 Map<String, Child> map1 = child.hoge(); 10 print(map1); 11 12 Map<String, Parent> map2 = new HashMap<String, Parent>(); 13 map2.putAll(map1); 14 print(map2); 15 16 // Map<String, Parent> map3 = map1; // コンパイルエラー★ 17 Map<String, ? extends Parent> map4 = map1; // これなら出来る。 18 print(map4); 19 20 Map map5 = map1; 21 Map<String, Parent> map6 = map5; 22 print(map5); 23 print(map6); 24 } 25 static void print(Map<String, ? extends Parent> map) { 26 for (Map.Entry<String, ? extends Parent> entry : map.entrySet()) { 27 String key = entry.getKey(); 28 Parent val = entry.getValue(); 29 System.out.println(key + " : " + val); 30 } 31 System.out.println(); 32 } 33 static class Parent { 34 public Map<String, ? extends Parent> hoge() { 35 Map<String, Parent> map = new HashMap<String, Parent>(); 36 map.put("1", new Parent()); 37 map.put("2", new Parent()); 38 map.put("3", new Parent()); 39 return map; 40 } 41 } 42 static class Child extends Parent { 43 44 @Override 45 public Map<String, Child> hoge() { 46 Map<String, Child> map = new HashMap<String, Child>(); 47 map.put("1", new Child()); 48 map.put("2", new Child()); 49 map.put("3", new Child()); 50 return map; 51 } 52 } 53}
試したこと
コンパイルエラー部分以外は、異常発生なくmainが終了する確認はしています。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/31 12:28