在地图中使用模板

时间:2015-01-15 19:36:59

标签: java

我正在编写一个名为arrayToMap()的函数。我最初只是允许String数组,但我认为我可以使它通用所以任何类型的数组。我尝试了以下代码段,但它告诉我T无法解析为类型:

public Map <T, Integer> arrayToMap( T [] arr ) {    
    assert( arr != null ) : "arrayToMap null array";
    Map<T,Integer> res = new HashMap<>();
    int ind = 0;
    for ( T val: arr ) {
        res.put(val, ind);
        ind++;
    }   
    return res;
}

正确的语法是什么?

1 个答案:

答案 0 :(得分:6)

签名应更改为:

// Notice the <T>, this is a generic method declaration
public <T> Map <T, Integer> arrayToMap( T [] arr )

这称为泛型方法,您可以阅读更多相关信息here。就像泛型类型声明(类和接口)一样,方法声明也可以是通用的,这意味着它们可以通过一个或多个类型参数进行参数化,例如上面示例中的<T>

但是,如果您的类是泛型类,即它被声明为泛型类型,则签名可以与原始示例中的相同。

// A generic type declaration <T>
public class MyClass<T> {

    // The type T comes from the generic type declaration,
    // therefore the generic method declaration is not needed
    public Map<T, Integer> arrayToMap(T [] arr) {
       ...
    }
}

但是,泛型类可能不是OP的原始用例的好方法,因为arrayToMap方法意味着它是一种可以使用的通用方法在任何类型的阵列上。