乍一看,cookiemonster.eat需要返回一个负长度的String。仔细看,有两个单独的要求:第一次调用eat时,它需要返回一个空String;第二次,它需要返回一个负值length()。
诀窍是,泛型方法的返回类型可能会有所不同,具体取决于使用它的类型上下文。为了证明这一点,让我们来看一个示例java.util.Collections:
回到我们的CookieMonster,我们可以让eat返回上下文期望它返回的任何内容:static
我们通过在C上设置一个bound来修复这个问题。要编译两个eat调用,bound必须是String的超类,并且有一个length()方法。有一种类型:charsequence。因此,我们将类型变量package monster;
public class CookieMonster {
public static <C extends CharSequence> C eat(String cookie) {
return (C) (cookie.length() > 0 ? "" : new CharSequence() {
public int length() {
return -1;
}
public char charAt(int index) {
throw new UnsupportedOperationException();
}
public CharSequence subSequence(int start, int end) {
throw new UnsupportedOperationException();
}
});
}
}