J'ai ces classes avec la méthode:Pourquoi les informations de type Java facultatif sont-elles perdues?
public abstract class Bar<T extends Bar> {
Foo myFoo;
public Optional<Foo> findFoo() { return Optional.ofNullable(this.myFoo); }
}
public class Baz extends Bar<Baz> {
}
, où Foo est une classe finale de béton et o est un objet qui s'étend Bar.
Il ok pour obtenir la valeur dans mon test unitaire de cette façon:
Bar bar = new Baz();
Optional<Foo> optinalFoo = bar.findFoo();
Foo foo = optionalFoo.get();
Cependant, lorsqu'il est appelé directement les informations de type est perdu:
Foo foo = bar.findFoo().get();
Dans le second exemple le compilateur pense obtenir() retourne un objet au lieu d'un Foo. Pourquoi? Y at-il un moyen de fournir les informations de type au compilateur d'une autre manière?
(je sais que vous devriez éviter d'appeler get() directement, mais étant donné que cela est dans un test unitaire, il est ok si elle jette sur des résultats inattendus.)
questions visant à obtenir l'aide de débogage (« pourquoi est-ce pas le code de travail? ») Doivent comprendre le comportement souhaité, un problème spécifique ou d'une erreur et le code le plus court nécessaire pour le reproduire dans la question elle-même. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: Comment créer un [mcve]. Plus précisément: qu'est-ce que ** o **? – GhostCat
Est-ce que 'Foo' est un type générique ou un type concret? Avoir "une classe avec une méthode" n'est pas suffisamment descriptif pour que nous puissions comprendre le problème ou reproduire le problème. –
il ne compilera pas en raison de 'return.ofNullable'. Qu'est-ce que ça veut dire? – Andrew