我正在尝试实施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>();
}
}
答案 0 :(得分:1)
在ShiroGuavaCacheManager
班级中,K
和V
未定义。因此,如果您想使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)
这是有效的,因为您可以根据分配给它的内容来决定K
和V
。所以你可以做到
Cache<String,String> = getCache("mycache");
这些只是通用方法http://docs.oracle.com/javase/tutorial/java/generics/methods.html