Реализация Number.valueOf () для обобщений Java - PullRequest
2 голосов
/ 12 апреля 2019

Я использовал Collection числовых значений и реализовал некоторые связанные функции (отображение значений x-> y и т. Д.). До сих пор я использовал дженерики, чтобы разрешить любой подкласс Number в Collection.

В этом конкретном классе я продолжаю сталкиваться с проблемой, заключающейся в том, что нет простого способа привести к универсальному. Обычные методы, такие как Double.valueOf(), не могут быть вызваны, потому что Number не предоставляет такой метод.

Есть ли хороший способ обойти это?

Я нашел этот пост и подумал, что это решит его, но я не могу передать ему параметр Class.class.

public class myList<T extends Number> extends Collection<T> {

  @Override
  public boolean add(T value){
    // this is no problem
  }

  // What I want to do:
  public boolean add(double value){
    return this.add(T.valueOf(value)); 
  }

  // Using the example I found:
  public void add(double value){
    return this.add( (T) Ideone.parse(value, T.class) ); // no such option
  }


}

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Класс myList не может преобразовать double в T, поскольку T неизвестно.

Одним из способов решения этой проблемы является предоставление вызывающей функции функции, которая преобразует значение из double в T. Вот пример:

public class myList<T extends Number> implements Collection<T> {

    private DoubleFunction<T> fromDoubleFunction;

    public myList(DoubleFunction<T> function) {
        this.fromDoubleFunction = function;
    }

    public boolean add(double value) {
        return this.add(this.fromDoubleFunction.apply(value));
    }

    //rest of code
}

Это может быть использовано следующим образом:

myList<Integer> intList = new myList(d -> Double.valueOf(d).intValue());
1 голос
/ 12 апреля 2019

Предоставьте DoubleFunction<T> вашему классу в качестве параметра конструктора.

public class myList<T extends Number> extends Collection<T> { 
  private final DoubleFunction<T> theDoubleFn;

  public myList(DoubleFunction<T> theDoubleFn) {
    this.theDoubleFn = theDoubleFn;
  }

  // ...

Затем вызовите:

return this.add(theDoubleFn.apply(value));

в методе.

...