简单的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”。

+3

你放入地图的东西需要是'K'和'V'类型。您正在放入一个'int'和一个'String',编译器不能保证它与签名''兼容。还要记住,泛型类型必须是对象 - 您需要使用“Integer”而不是“int”作为类型参数。 – JonK

+0

请注意,您定义方法的方式是编译器会尝试从方法返回值的赋值中推断出'K'和'V'的类型。问题是,在编译期间,编译器不能考虑对该方法的所有调用(可能有多个不同类型的调用),因此不会知道“K”和“V”实际是什么。在这种情况下,您需要提供一种方法来创建两种类型的值,例如通过传递它们作为参数,传递类和构造它们的实例,传递工厂等。 – Thomas

+0

用另一种方式来思考它:你告诉编译器为两种语言('K'和'V')创建一个字典,并且在打电话时可以定义这两种语言是英语和法语。但是,在这个方法里面,你放入字典/地图的内容都是中文和西班牙文字。它可能会发生这样的情况,调用者需要这些2,但他们不会这样做,因此编译器会拒绝构建该字典,以便不会因为生成错误而被解雇:) – Thomas

您定义了一个ConcurrentHashMap以获取类型为K的键和类型为V的值,但您尝试添加类型为'int'的键和类型为String的值。

+0

你已经告诉过我在我的代码中做了什么,但没有做任何解释 - 通用类型不能用泛型表示。泛型的全部用途是不能用来表示,以便我稍后可以决定在方法中的其他位置使用? – EricO

+1

@EricO 可以表示任何两种类型。但是,由于您定义了一个类型为的地图,因此它只能接受方法中的K键和V值。使用泛型定义数据类型是不可能的,并且在定义它的相同方法中添加不同类型。 –

+0

所以需要真正被问到的问题是:如何使Integer和String通用,以便ConcurrentHashMap 可以作为ConcurrentHashMap返回? – EricO