Java泛型 - 在方法参数和方法返回类型上编译错误

时间:2017-12-06 14:20:19

标签: java generics

说我有两个接口:

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());

3 个答案:

答案 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);