抽象方法的Java通配符返回类型

抽象方法的Java通配符返回类型,java,wildcard,abstract,Java,Wildcard,Abstract,关于通配符的Java文档说它们可以用作返回类型,但这通常不是一个好主意。如果通配符用作抽象方法的返回类型,但实现此方法的类返回具体类型,则仍然是这样吗?如果没有,处理这种情况的最佳方法是什么。考虑下面的例子。在这种情况下,实体可能是在JSON REST响应之后建模的,在第二种情况下,结果只是一个字符串列表。使用List作为返回类型还是完全使用其他类型更好 public abstract class AbstractClient { public abstract List<?>

关于通配符的Java文档说它们可以用作返回类型,但这通常不是一个好主意。如果通配符用作抽象方法的返回类型,但实现此方法的类返回具体类型,则仍然是这样吗?如果没有,处理这种情况的最佳方法是什么。考虑下面的例子。在这种情况下,
实体
可能是在JSON REST响应之后建模的,在第二种情况下,结果只是一个字符串列表。使用
List
作为返回类型还是完全使用其他类型更好

public abstract class AbstractClient {
    public abstract List<?> listEntities();
}

public class ConcreteClient {
    @Override
    public List<Entity> listEntities();
}

public class ConcreteClient2 {
    @Override
    public List<String> listEntities();
}
公共抽象类AbstractClient{
公共摘要列表列表();
}
公共类客户端{
@凌驾
公共列表列表();
}
公共类客户端2{
@凌驾
公共列表列表();
}

在这种情况下,最好正确使用泛型,而不是使用通配符。使用类型参数并使用类型参数的适当参数扩展抽象类:

public abstract class AbstractClient<T> {
    public abstract List<T> listEntities();
}

public class ConcreteClient extends AbstractClient<Entity> {
    @Override
    public List<Entity> listEntities();
}

public class ConcreteClient2 extends AbstractClient<String> {
    @Override
    public List<String> listEntities();
}
公共抽象类AbstractClient{
公共摘要列表列表();
}
公共类ConcreteClient扩展了AbstractClient{
@凌驾
公共列表列表();
}
公共类ConcreteClient2扩展了AbstractClient{
@凌驾
公共列表列表();
}