Pour répondre à cela, nous devons aller dans les détails et de comprendre ce qu'est un lambda est et comment il fonctionne.
Il faut d'abord comprendre ce qu'est un lambda est:
Une expression lambda toujours implémente une interface fonctionnelle, de sorte que lorsque vous avez à fournir une interface fonctionnelle comme Runnable
, au lieu de devoir créer une nouvelle classe qui implémente l'interface, vous pouvez simplement utiliser le lambda de la syntaxe pour créer une méthode de l'interface fonctionnelle exige. Gardez à l'esprit que le lambda a encore le type de l'interface fonctionnelle qu'elle est mise en œuvre.
Avec cela à l'esprit, permet de faire un pas de plus:
Cela fonctionne très bien, comme dans le cas de l'Exécutable, je peux juste créer un nouveau thread comme celui-ci new Thread(()->{//put code to run here});
au lieu de créer un tout nouvel objet de mettre en œuvre l'interface fonctionnelle. Cela fonctionne puisque le compilateur sait qu' Thread()
prend un objet de type Runnable, afin qu'il sache quel type de l'expression lambda doit être.
Toutefois, en cas d'attribution d'un lambda à une variable locale, le compilateur n'a aucune idée de ce qu'interface fonctionnelle cette lambda est la mise en œuvre de sorte qu'il ne peut pas en déduire ce type var
devraient l'être. Car c'est peut-être la mise en œuvre d'une interface fonctionnelle créés par l'utilisateur ou peut-être l' runnable
interface, il n'y a simplement aucun moyen de savoir.
C'est pourquoi elles ne fonctionnent pas avec le mot-clé var.