Java 通配符 return 抽象方法的类型
Java wildcard return type for abstract method
通配符的 Java 文档说它们可以用作 return 类型,但这通常不是一个好主意。如果将通配符用作抽象方法的 return 类型,但实现此方法的 class 是具体类型,这是否仍然正确?如果没有,处理此类情况的最佳方法是什么。考虑下面的例子。在这种情况下,Entity
可能会在 JSON REST 响应之后建模,而在第二种情况下,结果只是一个字符串列表。使用 List<Object>
作为 return 类型还是完全使用其他类型更好?
public abstract class AbstractClient {
public abstract List<?> listEntities();
}
public class ConcreteClient {
@Override
public List<Entity> listEntities();
}
public class ConcreteClient2 {
@Override
public List<String> listEntities();
}
在这种情况下,最好正确使用泛型而不是使用通配符。使用类型参数并使用类型参数的适当参数扩展抽象 class:
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();
}
通配符的 Java 文档说它们可以用作 return 类型,但这通常不是一个好主意。如果将通配符用作抽象方法的 return 类型,但实现此方法的 class 是具体类型,这是否仍然正确?如果没有,处理此类情况的最佳方法是什么。考虑下面的例子。在这种情况下,Entity
可能会在 JSON REST 响应之后建模,而在第二种情况下,结果只是一个字符串列表。使用 List<Object>
作为 return 类型还是完全使用其他类型更好?
public abstract class AbstractClient {
public abstract List<?> listEntities();
}
public class ConcreteClient {
@Override
public List<Entity> listEntities();
}
public class ConcreteClient2 {
@Override
public List<String> listEntities();
}
在这种情况下,最好正确使用泛型而不是使用通配符。使用类型参数并使用类型参数的适当参数扩展抽象 class:
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();
}