2015-08-27 3 views
1

У меня есть метод, реализующий метод интерфейса. это выглядит следующим образом:Как использовать Тип класса Общий метод

@Override 
public Double calculate(Class<Float> score) { 

    if (score == null) { 
     return null; 
    } 

    Double beta0 = new Double(-7.7631); 
    Double beta1 = new Double(0.0737); 
    Double beta2 = new Double(0.9971); 

    Log log = new Log(); 
    Exp exp = new Exp(); 

    Double logit = beta0 + (beta1 * score) + (beta2 * log.value(new Double(score + 1))); 
    Double rod = exp.value(logit)/(1 + exp.value(logit)); 

    return rod; 
} 

Интерфейс

public interface Calculator<T,S> { 
    public T calculate(Class<S> params); 
} 

Я получаю ошибку компиляции, что the operator '*' is not defined for the argument type(s) Double, Class<Float>.

Думаю, я ожидал этого, но не знаю, как это исправить. Извините, если это простой вопрос .....

+0

Возможно, вам стоит прочитать «Класс » –

+0

Непонятно также, почему вы используете классы вообще. У вашего кода нет преимущества использования 'Double' вместо' double' и использование 'double Double (...)' принимает значение max. – Holger

+0

Я пытался использовать дженерики, так что некоторые реализации калькулятора могли принимать другие типы. – skyman

ответ

2

Возможно, вы не хотите Class<Float>, а всего лишь Float в качестве параметра метода.

Математические операторы не относятся к типу Class, который используется для определения фактического класса (например, используется при отражении).

Кроме того, тщательно с операциями на double s, float s и их обертками: точность может быть потеряна, что дает неожиданные результаты.

советую использовать BigDecimal хотя бы внутренне.

Примечание

Кажется, вы @Override ING вашего метода, который, вероятно, подразумевает большую проблему с дизайном класса. Я бы посоветовал проверить родительский класс и сделать вывод, почему метод calculate принимает параметр Class.

Редактировать

Я хотел бы изменить свой метод интерфейса для:

public T calculate(S param); 

Вы могли бы также рассмотреть вопрос о связывании ваших общих типов вверх, чтобы расширить Number.

Что-то в линиях:

public interface Calculator<T extends Number, S extends Number> { 
    public T calculate(S param); 
} 

... и анонимный пример реализации:

Calculator<Double, Float> calc = new Calculator<Double, Float>() { 
    public Double calculate(Float param) { 
     // TODO logic 
     return null; 
    }; 
}; 
+0

ok - Я включил интерфейс. У меня есть куча разных калькуляторов, которые принимают разные аргументы, но имеют одну и ту же базовую структуру. Есть ли «лучший» способ структурировать это? – skyman

+0

@ skyman см. Мое редактирование. – Mena

+0

Это действительно полезно. Первоначально это объяснялось тем, что я также хотел передать более сложные списки параметров (например, ArrayLists или bean-компоненты) некоторым калькуляторам. Мне очень нравится концепция расширения номера, возможно, ваше первое предложение (S param) больше подходит для моего приложения. – skyman

0

Вы не можете использовать

Double logit = beta0 + (**beta1 * score**) + (beta2 * log.value(new Double(score + 1))); 

потому operatator "*" для него не определено ... Вы не можете размножать эти два разных типа. Вместо этого вы можете использовать float.

+1

Вот что вопрос –

+0

Я получаю аналогичную ошибку, если я изменяю общий тип на Double? – skyman

0

Вы должны получить double значение от Double класс. Как:

Double beta0 = new Double(0.07); 
double x = beta0.doubleValue(); 

Или использовать примитивный тип данных double во всем коде.

Cheers!

+2

Это было более десяти лет назад ... – Holger

+0

Затем мне нужно переучиться кое-что ... – davidkaste

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