2014-11-10 2 views
0

Поэтому я должен принять общий тип T, который будет классом-оболочкой для одного из числовых примитивов и с некоторой арифметикой. Я думал, что это было бы тривиально из Autoboxing и распаковка:Арифметика с общими номерами

T newval = val1*val2; 

(. Где знач1 и val2 уже переменные типа Т с соответствующими значениями в них)

Но получается, что Java не будет unbox, если он не знает тип явно во время компиляции. Я также подумал, что могу просто использовать метод multiply, который каждый из подклассов Number (который я намерен использовать) имеет внутри них. Поэтому я объявил свой класс с:

public class SomeClass<T extends Number> { 
    // ... 
} 

, а затем:

T newval = val1.multiiply(val2); 

Но это не работает, потому что я думаю, не все подклассы из числа обязательны к заполнению (Почему они не используют интерфейс для этого?), чтобы иметь этот метод (все же все, что я хочу использовать DO.)

Я видел некоторые подобные вопросы, но все они привели к тому, что OP говорили, что просто не используют дженерики, но я требуется использовать дженерики для работы, которую я делаю, иначе вся вещь бесполезна. Может ли кто-нибудь подумать о решении, которое будет работать на меня?

EDIT: Хорошо, чтобы он вернулся ко мне и уточнить, что означает, это достаточно разные, что мой вопрос больше не соответствует тому, что я делаю. Спасибо, парни.

+0

Nope. Это не будет работать с дженериками (если только они не связаны одним из числовых типов обертки, и в этом случае бесполезно использовать generics, поскольку эти типы являются «final»). –

+0

Это вопрос домашнего задания? Если да, можете ли вы дать точную формулировку требования этого класса? – RealSkeptic

+2

Я так понимаю, что @SotiriosDelimanolis дал отличный ответ на ваш вопрос. Однако я считаю, что ваше замешательство является результатом неправильных требований или дизайна. Я предлагаю вам объяснить, что вы действительно хотите сделать, и вы, вероятно, получите полезные ответы. – AlexR

ответ

3

Различные арифметические операторы могут применяться только к значениям типов, которые могут быть конвертированы в примитивные типы. Невозможно выразить это требование с помощью дженериков. Поэтому дженерики не подходят для этой задачи.

Для методов generics вместо этого используйте перегрузки для числовых примитивных типов. Для общих классов укажите подклассы, которые используют определенный числовой тип.

class NumericCalculator<T> { 
    public void calculate(T one, T two) { 
     T result = one * two; // compiler error 
    } 
} 

class LongCalculator extends NumericCalculator<Long> { 
    public void calculate(Long one, Long two) { 
     Long result = one * two; // yes 
    } 
} 

Реализация, использующая операторы, должна быть в подклассах, которые знают фактический тип.

+0

Я не совсем понимаю ваше решение, не могли бы вы объяснить это немного больше? –

+0

@JemarJones Я отредактировал код. Это яснее? –

+0

Хорошо, что имеет смысл –