简单的Java泛型示例
问题描述:
我在学习泛型。我想我会从一个简单的例子开始,这个例子说明了我目前对这个主题的理解,但那不起作用,我不知道为什么。我收到的错误与许多其他尝试使用泛型的人一样:“...类型中的方法...不适用于参数...”简单的Java泛型示例
我已阅读并通过Lesson: Generics (The Java Tutorials > Bonus)和许多交换所以我显然误解了一个关键概念,而这个概念并没有被这个问题上的众多重复问题所回答(也就是说,由于我缺乏理解,这个问题并没有得到回答,也不是由于缺乏知识尝试被传授)。对我来说,我的例子看起来像许多其他“回答”这些问题,然而......我们在这里。我正在努力学习,所以请慢慢输入。
import java.util.concurrent.ConcurrentHashMap;
public class TestMain {
public static void main(String[] args) { makeTable(ThisType.CUSTOMER); }
private enum ThisType { CUSTOMER, TRANSACTION }
static <K, V> ConcurrentHashMap<K, V> makeTable(ThisType type) {
ConcurrentHashMap<K, V> thisTable = new ConcurrentHashMap<>();
Integer key = 0;
String value = null;
switch (type) {
case CUSTOMER:
key = 0;
value = "nothing to report";
break;
case TRANSACTION:
break;
default:
break;
}
while (key < 10) {
thisTable.put(key, value);
key++;
}
return thisTable;
}
}
EDITED将“int”替换为“Integer”。
答
您定义了一个ConcurrentHashMap以获取类型为K的键和类型为V的值,但您尝试添加类型为'int'的键和类型为String的值。
你放入地图的东西需要是'K'和'V'类型。您正在放入一个'int'和一个'String',编译器不能保证它与签名''兼容。还要记住,泛型类型必须是对象 - 您需要使用“Integer”而不是“int”作为类型参数。 –
JonK
请注意,您定义方法的方式是编译器会尝试从方法返回值的赋值中推断出'K'和'V'的类型。问题是,在编译期间,编译器不能考虑对该方法的所有调用(可能有多个不同类型的调用),因此不会知道“K”和“V”实际是什么。在这种情况下,您需要提供一种方法来创建两种类型的值,例如通过传递它们作为参数,传递类和构造它们的实例,传递工厂等。 – Thomas
用另一种方式来思考它:你告诉编译器为两种语言('K'和'V')创建一个字典,并且在打电话时可以定义这两种语言是英语和法语。但是,在这个方法里面,你放入字典/地图的内容都是中文和西班牙文字。它可能会发生这样的情况,调用者需要这些2,但他们不会这样做,因此编译器会拒绝构建该字典,以便不会因为生成错误而被解雇:) – Thomas