说我有两个接口:
public interface IObjectOne<T>
{
List<T> digest(final List<T> myList);
}
public interface IObjectTwo<T>
{
List<T> create();
}
管理这两个接口的具体实现的对象,它必须在同一类型上工作。
public class Entity<T>
{
private IObjectOne<T> objectOne;
private IObjectTwo<T> objectTwo;
... setters
public IObjectOne<T> getObjectOne() {
return objectOne;
}
public IObjectTwo<T> getObjectTwo() {
return objectTwo;
}
}
这些Entity
存储在Map
中,我通过密钥检索其中一个:
final Entity<?> entity = entities.get(key);
为什么我不能这样做?
entity.getObjectOne().digest(entity.getObjectTwo().create());
答案 0 :(得分:2)
下面:
final Entity<?> entity = entities.get(key);
你说的是:你绝对不关心实体的确切类型。提醒:通配符表示“我不知道”确切的类型。
并且使用通配符进行泛型的一个结果,如here所述:
如果要对不同类型的方法参数强制实施某些关系,则不能使用通配符,必须使用类型参数。
换句话说:通过使用这样的通配符,编译器无法关联泛型类型。
答案 1 :(得分:2)
为此,您需要在具有类型变量的方法中执行操作:
<T> void doSomething(Entity<T> entity) {
entity.getObjectOne().digest(entity.getObjectTwo().create());
}
您甚至可以为Entity<?>
调用此项,因为该通配符具有某些类型,您只是不知道它。
final Entity<?> entity = entities.get(key);
doSomething(entity);
答案 2 :(得分:0)
您是如何创建Map<String, Entity<YOUR_TYPE>>
您应该对Entity<>
进行参数化,因为它是通用的。
Map<String, Entity<YOUR_TYPE>> entities = new HashMap<>();
final Entity<YourType> entity = entities.get(key);