Question: e.g. 

```
public interface CacheClient
{
    List<?> getKeysWithExpiryCheck();
}

```

Or should I return 

```
List<Object>

```

Answer: 
If you declare your method as

```
List<Object> getKeysWithExpiryCheck();

```

You can only return `List<Object>` instances from it, and nothing else. If you e.g. try to return `List<String>`, you get a compilation error. This is because although `Object` is a supertype of `String`, `List<Object>` is not a supertype of `List<String>`.
Basically it means that the collection can hold any type.
However when using it's impossible to modify the collection.

```
public void doSomething(Collection<?> col) {
    for (Object o : col) {
      System.out.println(o);
    }

    col.add("string"); //Compile Error here !
}

```