java 类型推断是如何工作的?
How does java type inference work?
谁能解释一下下面的语法是如何工作的?
public static <K, V> HashMap<K, V> getMap(){
return new HashMap<K, V>();
}
例如,如果此方法是在我自己的不可实例化的 util class 中实现的,则可以将其用作创建地图实例的静态工厂方法,对吗?
Map<Integer, String> myMap = MyUtil.getMap();
然后 return 一个新的 HashMap,其条目具有 Integer 键和 String 值,对吗?
如果是,编译器和VM是如何实现map的key和entry的类型的?
如果有人能解释一下 Java 是如何做到这一点的,我将不胜感激。
你问'how Java does this'。 Java 是在语言规范中定义的,它并不规定规范是如何实现的。因此,选择解决方案实际上取决于实施。因此,如果您真的想知道特定编译器或解释器如何实现类型推断,我怀疑熟悉该工具的人需要解决这个问题。
如果您的问题确实是 'what are the rules',那么您会发现 specification itself, and in the Java API documentation, and in the standard Java tutorial 中对它们进行了很好的解释(正式程度逐渐降低)。
这是一个相当复杂的领域,需要处理许多棘手的案例 - 事实上,它涉及三个过程才能正确理解(还原、合并和解析)。但是,如果您正在寻找一个简单的摘要,我会将其表述为 "when instantiating a class or method, replace each generic type with the most specific type possible"。在您的情况下,将 K
替换为 Integer
并将 V
替换为 String
是最具体的推理。
谁能解释一下下面的语法是如何工作的?
public static <K, V> HashMap<K, V> getMap(){
return new HashMap<K, V>();
}
例如,如果此方法是在我自己的不可实例化的 util class 中实现的,则可以将其用作创建地图实例的静态工厂方法,对吗?
Map<Integer, String> myMap = MyUtil.getMap();
然后 return 一个新的 HashMap,其条目具有 Integer 键和 String 值,对吗? 如果是,编译器和VM是如何实现map的key和entry的类型的?
如果有人能解释一下 Java 是如何做到这一点的,我将不胜感激。
你问'how Java does this'。 Java 是在语言规范中定义的,它并不规定规范是如何实现的。因此,选择解决方案实际上取决于实施。因此,如果您真的想知道特定编译器或解释器如何实现类型推断,我怀疑熟悉该工具的人需要解决这个问题。
如果您的问题确实是 'what are the rules',那么您会发现 specification itself, and in the Java API documentation, and in the standard Java tutorial 中对它们进行了很好的解释(正式程度逐渐降低)。
这是一个相当复杂的领域,需要处理许多棘手的案例 - 事实上,它涉及三个过程才能正确理解(还原、合并和解析)。但是,如果您正在寻找一个简单的摘要,我会将其表述为 "when instantiating a class or method, replace each generic type with the most specific type possible"。在您的情况下,将 K
替换为 Integer
并将 V
替换为 String
是最具体的推理。