2014-09-02 2 views
8

Я пытаюсь реализовать SCALA функциональный объект (в частности - для использования с Apache Spark)Реализация функции Scala в Java

эквивалентный тип Java является scala.Function0 (для параметра меньше функции)

кроме метод, реализующий бизнес-логику apply(), я вижу, что мне нужно реализовать несколько других методов.

Простой прибегая к помощи имена методов не помогло (я видел ссылку, касающуюся tag метода, который должен быть реализован, - но имя метода здесь разные

Вот код с теми методами (с пустой реализацией). .

private static class functionObject implements Function0<Integer>{ 

    @Override 
    public Integer apply() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public byte apply$mcB$sp() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public char apply$mcC$sp() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public double apply$mcD$sp() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public float apply$mcF$sp() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public int apply$mcI$sp() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public long apply$mcJ$sp() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public short apply$mcS$sp() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void apply$mcV$sp() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean apply$mcZ$sp() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

} 

Каковы эти методы? как они должны быть реализованы? есть уборщик решение, добавляя их к любому классу?

+0

Может быть глупый вопрос, но почему вы пытаетесь написать функцию SCALA в Java? Записывать в scala или писать java-конструкцию? – nablex

+0

Я пытаюсь использовать искру apache в проекте java. Искра - это проект scala, поэтому он ожидает объекты scala. Наш проект находится в java, поэтому я предпочитаю не добавлять scala-код. Теоретически, взаимодействие java-scala (и, в частности, java-spark) должно быть относительно простым - но, видимо, есть некоторые проблемы, которые не очень простые (или, по крайней мере, отсутствие документации) –

+0

@Ophiiryoktan Scala -> Java, легко. Java -> Scala; меняется. Легко, если scala lib был разработан для этого (!?!) Еще хрупкий беспорядок уродства –

ответ

14

Scalas FunctionX интерфейсы т райды, параметры которых являются специализированными. Поскольку специализация выполняется с помощью scalac и поэтому не может быть выполнена javac, вам необходимо реализовать все, что связано со специализацией.

Scala предоставляет абстрактные классы AbstractFunctionX, которые могут быть легко реализованы на стороне Java:

// example Int => Int function 
class Z extends scala.runtime.AbstractFunction1<Integer, Integer> { 
    public Integer apply(Integer i) { 
    return i; 
    } 
} 
+0

Отличный ответ! Я реализовал аналогичный класс (хотя и не специализированный), так как scala 2.7 не заметил, что он существует. Знаете ли вы, когда их представили? – paradigmatic

+0

@paradigmatic С декабря 2009 года: https://github.com/scala/scala/commit/f2056ddf4518285920db7554f6f93924f3cc3813 – sschaef