我在阅读泛型时遇到了PECS(制片extends人和消费者的super简称).
能否给我一个人解释如何使用佩奇之间解决困惑extends和super?
我有以下代码:
private HashMap<Class<?>, HashMap<Entity, ? extends Component>> m_componentStores;
public <T extends Component> T getComponent(Entity e, Class<T> exampleClass)
{
HashMap<Entity, ? extends Component> store = m_componentStores.get(exampleClass);
T result = (T)store.get(e);
if (result == null)
{
throw new IllegalArgumentException( "GET FAIL: "+e+" does not possess Component of class\nmissing: "+exampleClass );
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
当我编译时,它显示T result = (T)store.get(e)有一个未经检查的强制转换.
Type safety: Unchecked cast from capture#2-of ? extends Component to T
Run Code Online (Sandbox Code Playgroud)
为防止出现此警告,我错过了什么?
有用.
方法声明
<T> Session<T> start(Criteria<T> criteria, List<Property<T>> orders);
Run Code Online (Sandbox Code Playgroud)
用法
Criteria<? extends Product> criteria = Utils.getCriteria();
Session<? extends Product> session = null;
session = Service.start(criteria, null);
Run Code Online (Sandbox Code Playgroud)
它不起作用.
方法声明
<T> List<Session<T>> start(Criteria<T> criteria, List<Property<T>> orders)
Run Code Online (Sandbox Code Playgroud)
用法
Criteria<? extends Product> criteria = Utils.getCriteria();
List<Session<? extends Product>> sessions = null;
sessions = Service.start(criteria, null);
Run Code Online (Sandbox Code Playgroud)
错误信息
Type mismatch: cannot convert from List<Session<capture#2-of ? extends Product>> to List<Session<? extends Product>>
Run Code Online (Sandbox Code Playgroud)
如果我将方法声明更改为此,它可以工作.
<T> List<Session<? extends T>> start(Criteria<? extends T> criteria, List<Property<? extends T>> orders)
Run Code Online (Sandbox Code Playgroud)
为什么这个方法声明不起作用?
<T> List<Session<T>> …Run Code Online (Sandbox Code Playgroud) 我有一个问题(简化):
public void method(List<List<?>> list){...}
Run Code Online (Sandbox Code Playgroud)
调用时给出了一个编译错误:
method(new ArrayList<List<String>>()); // This line gives the error
Run Code Online (Sandbox Code Playgroud)
在阅读了类似的线程之后,我明白如果我将方法签名重写为:
public void method(List<? extends List<?>> list){...}
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是,为什么以下工作呢?
public <T> void method(List<List<T>> list){...}
Run Code Online (Sandbox Code Playgroud) 为什么以下代码行在HashMap中出错?它并没有在任务的右侧使用外卡.
Map<String,?> map=new HashMap<String,?>();
Run Code Online (Sandbox Code Playgroud)