2017-01-19 206 views
1

我想填充數組中的方法。但我必須以一種奇怪的方式做到這一點:將方法添加到對象數組

public class AssignFunctionalInterfaceTest { 

    public void test() { 
     TestEntity t = new TestEntity(); 

     // compiles 
     Supplier<Integer> a = t::getB; 
     Object[] b = new Object[] {"42", a}; 

     // compiles 
     Object[] b2 = new Object[] {"42", (Supplier<Integer>) t::getB}; 

     // doesn't compile. Error message: 
     // "The target type of this expression must be a functional interface" 
     Object[] b3 = new Object[] {"42", t::getB}; 
    } 


    public static class TestEntity { 

     public Integer getB() { 
      return 0; 
     } 
    } 
} 

我真的很想找到一種方法來使第三項任務的工作。有任何想法嗎?

+0

爲什麼「42」是數組中的值?它需要成爲?否則你可以創建一個'供應商 []'而不是'Object []' – CraigR8806

+0

這實際上是關於混合在一起的事情。我明白你的觀點,但對我的問題沒有幫助。 –

+0

我可能對此有錯,但我想爲什麼它不會讓你只是將方法引用放在數組中,是因爲它需要以某種方式與'Supplier <>'相關聯,因爲它改變了它的方式由編譯器查看。我認爲'Supplier <>'類在指針和編譯器的實際方法之間建立了聯繫。 – CraigR8806

回答

0

這就是爲什麼你不能只寫同樣的事情:

Object x = t::getB; 

創建拉姆達類的對象是一個語法糖,並且需要類型進行明確定義。欲瞭解更多信息,請閱讀JLS, 15.13

+0

沉重的東西。你說不行嗎?演員是最短路嗎?我發現供應商也就夠了。 –