Javaは私にこれをさせます:
public static class SomeType<I>{}
private static Map<Class<?>, Object> m = new HashMap<Class<?>, Object>();
public static <X> List<SomeType<X>> getList(Class<X> clazz)
{
return (List<SomeType<X>>)m.get(clazz);//warning
}
また、これを行うことができます:
public static class SomeType<I>{}
private static Map<Class<?>, List<?>> m = new HashMap<Class<?>, List<?>>();
public static <X> List<SomeType<X>> getList(Class<X> clazz)
{
return (List<SomeType<X>>)m.get(clazz);//warning
}
しかし、それは私にこれをさせません:
public static class SomeType<I>{}
private static Map<Class<?>, List<SomeType<?>>> m = new HashMap<Class<?>, List<SomeType<?>>>();
public static <X> List<SomeType<X>> getList(Class<X> clazz)
{
return (List<SomeType<X>>)m.get(clazz);//will not compile
}
次の回避策に頼らない限り:
public static class SomeType<I>{}
private static Map<Class<?>, List<SomeType<?>>> m = new HashMap<Class<?>, List<SomeType<?>>>();
public static <X> List<SomeType<X>> getList(Class<X> clazz)
{
return (List<SomeType<X>>)(Object)m.get(clazz);//warning
}
そのため、Java は から オブジェクト へA<B<C>>、 からへ、 からA<?>へA<B<C>>ではなく、 からA<B<?>>への明示的な変換を可能にしA<B<C>>ます。
何故ですか?