Java类型参数混淆

时间:2013-12-13 00:55:40

标签: java shiro

我正在尝试实施Apache Shiro CacheManager interface。它唯一的方法有以下特征:

<K,V> Cache<K,V> getCache(String name) throws CacheException

似乎最左边的<K, V>类型参数有效地告诉编译器K和V是“类型”。我的问题是:如何返回该类型的实例?当我尝试以下代码时,Eclipse抱怨K和V无法解析为类型:

public class ShiroGuavaCacheManager implements CacheManager
{
    private Cache<K, V> cache; // <--- The compiler complains here

    @Override
    public <K, V> Cache<K, V> getCache(String name) throws CacheException
    {
        return (cache != null) ? cache : new ShiroGuavaCache<K, V>();
    }
}

1 个答案:

答案 0 :(得分:1)

ShiroGuavaCacheManager班级中,KV未定义。因此,如果您想使ShiroGuavaCacheManager泛型,那就像

public class ShiroGuavaCacheManager<K,V> implements CacheManager
{
    private Cache<K, V> cache; // without the class level K,V definitions, K and V are not known types

    @Override
    public Cache<K, V> getCache(String name) throws CacheException
    {
        return (cache != null) ? cache : new ShiroGuavaCache<K, V>();
    }
} 

然后你可以创建一个new ShiroGuavaCacheManager<String,String>()例如。



如果您有一个定义类型的方法(如原始类中):

public <K, V> Cache<K, V> getCache(String name)

这是有效的,因为您可以根据分配给它的内容来决定KV。所以你可以做到

Cache<String,String> = getCache("mycache");

这些只是通用方法http://docs.oracle.com/javase/tutorial/java/generics/methods.html