在 Java 6 中,我可以使用:
public static <T, UK extends T, US extends T> T getCountrySpecificComponent(UK uk, US us) {
Country country = CountryContext.getCountry();
if (country == Country.US) {
return us;
} else if (country == Country.UK) {
return uk;
} else {
throw new IllegalStateException("Unhandled country returned: "+country);
}
}
使用这些存储库:
public interface Repository{
List<User> findAll();
}
public interface RepositoryUS extends Repository{}
public interface RepositoryUK extends Repository{}
使用这些时:
RepositoryUK uk = ...
RepositoryUS us = ...
此行在 Java6 中编译,但在 Java7 中失败(错误找不到符号 - 因为编译器在类 Object 上查找 findAll())
List<User> users = getCountrySpecificComponent(uk, us).findAll();
这在 Java 7 中编译
List<User> users = ((Repository)getCountrySpecificComponent(uk, us)).findAll();
我知道这是一个相当少见的用例,但有这种变化的原因吗?还是一种告诉编译器“更聪明”的方法?