例如
public interface CacheClient
{
List<?> getKeysWithExpiryCheck();
}
或者我应该返回
List<Object>
这是Java泛型的一个很好的介绍。[A] 和 [B] 解释 之间的区别?和对象。基本上, ?表示类型未知,如果您需要将项目添加到列表中,这是一个问题。但是,如果您只从列表中读取,则可以将结果视为对象。虽然,我建议使用类似的东西
public interface CacheClient {
List<? extends Key> getKeysWithExpiryCheck();
}
[A] http://java.sun.com/docs/books/tutorial/extra/generics/subtype.html
[B] http://java.sun.com/docs/books/tutorial/extra/generics/wildcards.html
如果您将方法声明为
List<Object> getKeysWithExpiryCheck();
您只能List<Object>
从中返回实例,而不能返回其他任何内容。如果你尝试返回List<String>
,你会得到一个编译错误。这是因为虽然Object
是 的超类型String
,但List<Object>
不是 的超类型List<String>
。
难道是为了保证类型安全?返回对象列表意味着该列表可以包含任何内容。
基本上这意味着该集合可以包含任何类型。但是,使用时无法修改集合。
public void doSomething(Collection<?> col) {
for (Object o : col) {
System.out.println(o);
}
col.add("string"); //Compile Error here !
}