Java-метод не применим для аргументов ERROR - PullRequest
0 голосов
/ 31 октября 2018

я пишу программу и получаю этот тип ошибки:

Метод orElse (Integer) в типе Maybe не применим для аргументов (String)

Еще одна ошибка, которую я получаю: невозможно преобразовать объект в строку в

   msg = Maybe.of(txt)
               .filter(t -> t.length() > 0)
               .orElse("Txt is null or empty"); 

Кроме того, я не совсем уверен, что методы orElse () и filter () работают правильно, но я не могу двигаться вперед с появлением этой ошибки. Заранее спасибо за помощь.

Это мой главный:

package Maybe;


public class Main {

  public static void test() {

    Integer num = null;

    // orElse() METHOD
    // INSTEAD OF
    String snum = null;
    if (num != null) snum = "Value is: " + num;
    if (snum != null) System.out.println(snum);
    else System.out.println("Value unavailable");

//    //ONE CAN WRITE
//    String res = Maybe.of(num).map(n -> "Value is: "+n)
//                      .orElse("Value unavailable");
//    System.out.println(res);

    //filter(...) METHOD

    String txt = "Dog";
    String msg = "";
    //INSTEAD OF
    if (txt != null && txt.length() > 0) {
      msg = txt;
    } else {
      msg = "Txt is null or empty";
    }

    //ONE CAN WRITE
//    msg = Maybe.of(txt)
//               .filter(t -> t.length() > 0)
//               .orElse("Txt is null or empty"); 
//    System.out.println(msg);


  }

  public static void main(String[] args) {
    test();
  }
}

И мой класс Maybe:

package Maybe;

import java.util.NoSuchElementException;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

public class Maybe<T> {

    T cont;

    public Maybe(T val) {
        this.cont = val;
    }

    public Maybe() {
    }

    public static <T> Maybe <T> of(T val) {
        Maybe <T> m = new Maybe<T>(val);        
        return m;
    }

    public void ifPresent(Consumer<T> cons) {
        if(isPresent()) {
            cons.accept(get());
        }
    }

    public <R> Maybe <T> map(Function<T, R> func) {
        Maybe<T> mb = new Maybe();
        if(isPresent()) {
            mb = new Maybe(func.apply(get()));
        }
        return mb;
    }

    public T get(){     
        if(isPresent()) {
            return this.cont;
        } else {
            NoSuchElementException exc = new NoSuchElementException("maybe is empty");
            throw exc;
        }
    }

    public boolean isPresent() {
        if(this.cont != null) {
            return true;
        } else {
            return false;
        }
    }

    public T orElse(T defVal) {
        if(isPresent()) {
            return get();
        }
        return defVal;
    }

    public Maybe filter(Predicate pred) {
        if(pred.test(pred) || !isPresent()) {
            return this;
        } else {
            Maybe mb = new Maybe();
            return mb;
        }
    }



    public String toString() {
        if(isPresent()) {
            return "Maybe has value " + cont;
        }else {
            return "Maybe is empty";
        }

    }

}

1 Ответ

0 голосов
/ 31 октября 2018
public Maybe filter(Predicate pred)

Ваш метод filter принимает предикат raw и возвращает необработанный Maybe.

Это означает, что он ожидает предикат, который будет работать для любого объекта, и он дает Maybe, который может содержать любой тип объекта.

Это должно быть что-то вроде

public Maybe<T> filter(Predicate<? super T> pred) {
    if (isPresent() && !pred.test(cont)) {
        return new Maybe<T>();
    }
    return this;
}

Таким образом, он будет принимать только предикат, который работает для универсального типа T, и возвращает Maybe, который может содержать только объект типа T.


Также ваша функция map неправильная.

public <R> Maybe <T> map(Function<T, R> func)

Предполагается, что после того, как к вашему T будет применено func, у вас будет Maybe<T>. Но на самом деле у вас будет Maybe<R>, потому что R - это то, что func производит.

Это будет иметь больше смысла:

public <R> Maybe<R> map(Function<T, R> func) {
    if (isPresent()) {
        return new Maybe<R>(func.apply(cont));
    }
    return new Maybe<R>();
}

Вот код, работающий:

jshell> String txt = "Hi";
txt ==> "Hi"

jshell> String msg = Maybe.of(txt).filter(t -> t.length() > 0).orElse("Empty");
msg ==> "Hi"

jshell> txt = "";
txt ==> ""

jshell> msg = Maybe.of(txt).filter(t -> t.length() > 0).orElse("Empty");
msg ==> "Empty"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...