2014-11-09 4 views
0

Я пытаюсь сделать создавать многостраничные каталоги и файлы проще с follwoing кодом:Java: как передать класс лямбда

package ro.ex; 

class File { 

    public interface Lamb { 
     public void call(Class c); 
    } 

    public static void tap(Lamb l) { 
     l.call(File.class); 
    } 

    public static void mkdir(String path) { 
    } 

    public static void main(String[] args) { 
     File.tap((f) -> { 
      f.mkdir("dir"); 
      f.mkdir("dir2"); 
     }); 
    } 
} 

но в f.mkdir("dir"), IntelliJ идея рейза не может решить метод «MKDIR»

мой вопрос: как изменить код, чтобы сделать код в основной блок работы скважины

+0

Почему ваш 'mkdir' называет все передать' String' но ваш 'mkdir' метод не принимает любые параметры? –

ответ

3

Согласно договору способа, File.tap() принимает параметр Lamb.

Lamb - функциональный интерфейс (содержит только один абстрактный метод), а тело вашей лямбда - анонимная реализация его абстрактного метода.

У абстрактного метода есть определение public void call(Class c), и именно поэтому ваш код не удается скомпилировать. Вы пытаетесь передать объект File вместо Class.

В то же время, mkdir статический метод и может быть вызван следующим образом:

public static void main(String[] args) { 
    File.tap((f) -> { 
     File.mkdir("dir"); 
     File.mkdir("dir2"); 
    }); 
} 
+0

Как изменить «класс» на «File.class», я попробую «File.class», но синтаксис неверен – zizhuo64062kw

+1

Просто сделайте это: 'public void call (File f);' –

1

Вы определили (функциональный) интерфейс Lamb которого один метод принимает Class как аргумент.

Так что f в вашем выражении лямбда (f) -> { ... } имеет тип Class. Но этот класс не знает метода mkdir.

У вас есть статический метод mkdir в вашем пользовательском классе File. Статические методы называются так:

File.tap((f) -> { 
    File.mkdir("dir"); 
    File.mkdir("dir2"); 
}); 

Это делает Class аргумент в методе Lamb.call(Class) довольно бесполезно. Возможно, вы хотите пересмотреть дизайн.

+0

Как изменить «Class» на «File.class», я попробую «File.class», но синтаксис неверен – zizhuo64062kw

+0

Если вы хотите _call file_, просто объявите свой метод: 'void call (File f)' и убедитесь, что не смешивать его с 'java.io.File'. – Seelenvirtuose

Смежные вопросы