Predicate<? super String> lambda = t -> t.isEmpty();
MerciHenri
public <T> Class<T> cast(Class<?> clazz) {
return (Class<T>) clazz;
}
public static <T> ArgumentCaptor<T> forClass(Class<? super T> clazz) {
return new ArgumentCaptor<T>(clazz);
}
Mais c'est honteux parce que maintenant un peu tout passe. Par exemple ça
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(Object.class);Quel serait ta solution?
--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "lescastcodeurs".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse lescastcodeur...@googlegroups.com.
Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse lescast...@googlegroups.com.
Visitez ce groupe à l'adresse http://groups.google.com/group/lescastcodeurs.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.
Comme l'objectif semble être de vouloir autant avoir une inférence sur le type du retour que exploiter le type du type du generic, je ne connais que cette facon qui consisterait à passer par un mécanisme de sub class permettant d'accéder au généric @ runtime:
Par exemple:
ArgumentCaptor<List<String>> captor = ArgumentCaptor.forClass(new TypeReference<List<String>>(){});
Facon de faire tirée de jackson.
Pour une fois qu'un bug est utile !!!, il me semble que c'est aussi utilisé par Google Guice TypeLiteral et certainement par d'autres librairies (moi le premier) car c'est très pratique pour définir des contrats du style
WaveItemBase<List<JRebirthEvent>> EVENTS = new WaveItemBase<List<JRebirthEvent>>() {};
Ce qui permet de dire explicitement qu'on veut une liste d'event, pas de patates (et de stocker l'info quelque part).
Concernant les generics il y a de quoi se faire de sérieux nœuds au cerveau, un truc que j'ai jamais compris c'est pourquoi on ne peut pas réutiliser le type generic de la definition de la classe dans certaines méthodes utilisant le même type generic.
public interface Facade<R extends FacadeReady<R>> {
R void register(final UniqueKey<R> uniqueKey, final R readyObject);
}
==> ne compile pas !
alors que
public interface Facade<R extends FacadeReady<R>> {
<E extends R> void register(final UniqueKey<E> uniqueKey, final E readyObject);
}
==> compile bien mais c'est bien moche
On 02/12/2015 05:13 PM, Sebastien Bordes wrote:
Pour une fois qu'un bug est utile !!!, il me semble que c'est aussi utilisé par Google Guice TypeLiteral et certainement par d'autres librairies (moi le premier) car c'est très pratique pour définir des contrats du style
WaveItemBase<List<JRebirthEvent>> EVENTS = new WaveItemBase<List<JRebirthEvent>>() {};
Ce qui permet de dire explicitement qu'on veut une liste d'event, pas de patates (et de stocker l'info quelque part).
Concernant les generics il y a de quoi se faire de sérieux nœuds au cerveau, un truc que j'ai jamais compris c'est pourquoi on ne peut pas réutiliser le type generic de la definition de la classe dans certaines méthodes utilisant le même type generic.
public interface Facade<R extends FacadeReady<R>> {
R void register(final UniqueKey<R> uniqueKey, final R readyObject);
}
==> ne compile pas !
normal, ton type de retour c'est R ou void, il faut choisir
alors que
public interface Facade<R extends FacadeReady<R>> {
<E extends R> void register(final UniqueKey<E> uniqueKey, final E readyObject);
}
==> compile bien mais c'est bien moche
la seconde déclaration est équivalente à
public interface Facade<R extends FacadeReady<R>> {
void register(UniqueKey<? extends E> uniqueKey, E readyObject);
}
Petite question, en quoi est ce vraiment mal de réutiliser un paramètre en tant que variable local? (Assigner une valeur à un paramètre)
++
Yan
Petite question, en quoi est ce vraiment mal de réutiliser un paramètre en tant que variable local? (Assigner une valeur à un paramètre)
++
Yan
--
Vous recevez ce message, car vous êtes abonné à un sujet dans le groupe Google Groupes "lescastcodeurs".
Pour vous désabonner de ce sujet, visitez le site https://groups.google.com/d/topic/lescastcodeurs/NJb9WO2EdI8/unsubscribe.
Pour vous désabonner de ce groupe et de tous ses sujets, envoyez un e-mail à l'adresse lescastcodeur...@googlegroups.com.
Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse lescast...@googlegroups.com.
Visitez ce groupe à l'adresse http://groups.google.com/group/lescastcodeurs.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.
par exemple:Alors moi aussi je me suis trompé dans l'explication et le bout de code :(Le code qui pose problème est bien sur :
public interface Facade<R extends FacadeReady<R>> {
void register(final UniqueKey<R> uniqueKey, final R readyObject);
}(sans le R en trop)Le problème n'est pas qu'il ne compile pas, c'est plutôt lors de l'appel de cette méthode depuis une classe avec une méthode qui prend un type Generique Model extends FacadeReady
public final <M extends Model> M register(final UniqueKey<M> modelKey, M model) {
getUiFacade().register(modelKey, model);}==> et bien dans ce cas la ça ne compile plus avec la deuxième version de la méthode ! Pourtant Model est bien un FacadeReady !, idem à d'autres endroits dans le code en utilisant des Class<M>.Donc la méthode la plus simple pour éviter de rajouter des cast tout moche partout a été de ruser avec <E extends R>Bref je ne trouve pas que ce je voulais faire était fondamentalement faux mais ce n'est visiblement pas supporté... (le code est sur github si quelqu'un veut relever le défi...)Concernant les final sur les paramètres, je suis innocent votre honneur ce n'est pas moi c'est le SaveAction de mon IDE, il fait automatiquement un cleanup de mon code...
Pour la lisibilité on s'y habitue et on évite aussi de mettre trop de paramètres sinon le Qube gueule aussi.
Je vais tester cette fonctionnalité car je ne la connaissais pas, mais vaut-il mieux ne pas dépendre d'une feature de l'IDE ?
De toute manière le code exécuté est le même donc le débat sur les final ca devient: lisibilité vs fonction IDE
--
Vous recevez ce message car vous êtes abonné à un sujet dans le groupe Google Groupes "lescastcodeurs".
Pour vous désabonner de ce sujet, visitez le site https://groups.google.com/d/topic/lescastcodeurs/NJb9WO2EdI8/unsubscribe.
Pour vous désabonner de ce groupe et de tous ses sujets, envoyez un e-mail à l'adresse lescastcodeur...@googlegroups.com.
Pour envoyer un message à ce groupe, adressez un e-mail à lescast...@googlegroups.com.
Visitez ce groupe à l'adresse http://groups.google.com/group/lescastcodeurs .
Pour plus d'options, visitez le site https://groups.google.com/d/optout .
--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "lescastcodeurs".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse lescastcodeur...@googlegroups.com.
Vous recevez ce message, car vous êtes abonné à un sujet dans le groupe Google Groupes "lescastcodeurs".
Pour vous désabonner de ce sujet, visitez le site https://groups.google.com/d/topic/lescastcodeurs/NJb9WO2EdI8/unsubscribe.
Pour vous désabonner de ce groupe et de tous ses sujets, envoyez un e-mail à l'adresse lescastcodeur...@googlegroups.com.
Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse lescast...@googlegroups.com.
Visitez ce groupe à l'adresse http://groups.google.com/group/lescastcodeurs.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.
final int x = blah();
final x = blah()
def x = blah()
int x = blah()
-- Cédric Champeau Groovy language developer http://twitter.com/CedricChampeau http://melix.github.io/blog
--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes lescastcodeurs.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse lescastcodeur...@googlegroups.com.
Pour envoyer un message à ce groupe, adressez un e-mail à lescast...@googlegroups.com.
Visitez ce groupe à l'adresse http://groups.google.com/group/lescastcodeurs .
Pour plus d'options, visitez le site https://groups.google.com/d/optout .
2015-02-13 6:56 GMT-08:00 Sebastien Bordes <sebastie...@gmail.com>:
Pour les final ce n'est pas utilisé pour optimiser, juste pour éviter de faire des re-assignations de variable qui vont plus nuire à la lisibilité que les pauvre final dans la signature de la méthode.
Je suis de l’opinion inverse: j’ai dit à toutes mes équipes de ne jamais utiliser final
dans les signatures ou les variables locales. Raisons :
final
partout obscurcissent le code et le rendent plus difficile à lire.