In Java 6 konnte ich verwenden:Compiler Änderung in Java 7
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);
}
}
Mit diesen Repositories:
public interface Repository{
List<User> findAll();
}
public interface RepositoryUS extends Repository{}
public interface RepositoryUK extends Repository{}
Bei Verwendung dieser:
RepositoryUK uk = ...
RepositoryUS us = ...
Diese Linie stellt in in Java6, aber in Java7 fehlgeschlagen (Fehler kann kein Symbol finden - da der Compiler in der Klasse Object nach findAll() sucht)
List<User> users = getCountrySpecificComponent(uk, us).findAll();
Dies kompiliert in Java 7
List<User> users = ((Repository)getCountrySpecificComponent(uk, us)).findAll();
Ich weiß, das ist ein eher selten Verwendung Fall aber gibt es einen Grund für diese Änderung? Oder eine Möglichkeit, dem Compiler ein wenig "schlauer" zu sagen?
Was ist der Zweck des 'T' -Typs? Können Sie diesen generischen Parameter eliminieren und haben 'UK' und' US' das 'Repository' erweitert? Ich denke, das ist die Wurzel des Problems - der Compiler kann nicht wissen, dass alles, was Sie an "getCountrySpecificComponent()" übergeben, ein 'Repository' ist, es sei denn, Sie sagen es ihm. –
Gute Frage! Ich möchte es für alle Arten von Repositories, Diensten und anderen Dingen verwenden, die länderspezifisch sind. Ich versuche nur, es generischer/benutzbarer zu machen. – skytteren
Ich sehe nicht, wie dies auch in Java 6 hätte kompiliert werden können, wenn nicht eine gefährliche Annahme gemacht wurde ... Warum sollte 'T'' Repository' sein, wenn es genauso einfach 'Object' in dem gegebenen Fall sein kann? – mellamokb