Question

Considérez le code ci-dessous,

interface TestInter {
    public void abc();
}


class DemoStatic {

    public static void testStatic(String abc) {
        System.out.println(abc);
    }

    public void runTest () {

        // Using lambda expression.
        String str = "demo string" ;
        TestInter demo1 = () -> DemoStatic.testStatic(str);
        demo1.abc();

        // Using method reference.
        TestInter demo2 = DemoStatic::testStatic; // This line is not compiling.
        demo2.abc();
    }
}

Nous pouvons invoquer le testStatic méthode comme corps de TestInter les interfaces abc() implémentation si paramètre de testStaic() méthode sera éliminée comme décrit dans ça, alors réponds.

Mais dans ce cas, comment pouvons-nous écrire une référence de méthode pour la méthode paramétrée testStatic?

Était-ce utile?

La solution

Votre interface fonctionnelle TestInter n'a pas de signature correspondante pour votre testStatic(String) méthode.Si vous voulez faire référence à testStatic() en utilisant le :: notation, vous devez ajouter le paramètre :

interface TestInter2 {
    public void abc(String abc);
}

public void runTest () {
    TestInter2 demo2 = DemoStatic::testStatic;
    demo2.abc(str);
}

Selon Tutoriel Oracle Java, il existe quatre types de référence de méthode :

Four Types of Method Reference

J'ai préparé 3 interfaces - pour les paramètres 0, 1 et 2.Nous avons ensuite 3 méthodes statiques et 3 méthodes d'instance :

interface F0 {
    void f0();
}
interface F1 {
    void f1(MetRef i1);
}
interface F2 {
    void f2(MetRef i1, MetRef i2);
}

public class MetRef {
    public static void stat0() {;}
    public static void stat1(MetRef a) {;}
    public static void stat2(MetRef a, MetRef b) {;}

    public void inst0() {;}
    public void inst1(MetRef a) {;}
    public void inst2(MetRef a, MetRef b) {;}
}

Regardez maintenant comment chacune des méthodes peut être utilisée comme référence de méthode dans diverses combinaisons, comparez-les avec le tableau précédent.Découvrez différents types de références de méthodes en action et notez d’où proviennent les paramètres.

public class Test {
    public static void main(String[] args) {
        final MetRef mr = new MetRef();

        final F0 mr01 = MetRef::stat0; // 1: f0() ~ MetRef.stat0() 
        final F0 mr02 = mr::inst0;     // 2: f0() ~ mr.inst0()
        final F0 mr04 = MetRef::new;   // 4: f0() ~ new MetRef()

        final F1 mr11 = MetRef::stat1; // 1: f1(i1) ~ MetRef.stat1(i1)
        final F1 mr12 = mr::inst1;     // 2: f1(i1) ~ mr.inst1(i1)
        final F1 mr13 = MetRef::inst0; // 3: f1(i1) ~ i1.inst0()       <== NOTICE!

        final F2 mr21 = MetRef::stat2; // 1: f2(i1, i2) ~ MetRef.stat2(i1, i2)
        final F2 mr22 = mr::inst2;     // 2: f2(i1, i2) ~ mr.inst2(i1, i2)
        final F2 mr23 = MetRef::inst1; // 3: f2(i1, i2) ~ i1.inst1(i2) <== NOTICE!
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top