Java 带泛型数的算术

Java 带泛型数的算术,java,generics,Java,Generics,所以我必须接受一个泛型类型T,它将是一个数字原语的包装类,并用它做一些算术运算。我认为这将是微不足道的,因为自动装箱和取消装箱: T newval = val1*val2; (其中,val1和val2已经是T型变量,其中包含适当的值。) 但事实证明,如果Java在编译时不明确知道类型,它就不会取消装箱。我还认为我可以使用乘法方法,每个数字子类(我打算使用)都有这个方法。所以我宣布我的班级是: public class SomeClass<T extends Number> {

所以我必须接受一个泛型类型T,它将是一个数字原语的包装类,并用它做一些算术运算。我认为这将是微不足道的,因为自动装箱和取消装箱:

T newval = val1*val2;
(其中,val1和val2已经是T型变量,其中包含适当的值。)

但事实证明,如果Java在编译时不明确知道类型,它就不会取消装箱。我还认为我可以使用乘法方法,每个数字子类(我打算使用)都有这个方法。所以我宣布我的班级是:

public class SomeClass<T extends Number> {
    // ...
}
但这不起作用,因为我想不是所有的Number子类都需要(为什么他们不为此使用接口?)来使用该方法(但我想使用的所有子类都需要)

我见过一些类似的问题,但它们都导致OP被告知不要使用泛型,但我被要求在我正在做的工作中使用泛型,否则整个事情就一文不值了。有人能想出一个对我有用的解决办法吗

编辑:
好吧,他给我回了电话,澄清了这是什么意思,这已经足够不同了,我的问题不再和我在做什么有关了。谢谢大家。

各种算术运算符只能应用于可转换为基本类型的类型的值。没有办法用泛型来表达这个需求。因此,泛型不适合此任务

对于泛型方法,而是为数值基元类型提供重载。 对于泛型类,提供使用特定数值类型的子类

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
    }
}
类数值计算器{
公共空间计算(t1,t2){
T result=one*two;//编译器错误
}
}
类LongCalculator扩展了NumericCalculator{
公共空间计算(长一、长二){
长结果=1*2;//是
}
}

使用运算符的实现必须位于知道实际类型的子类中。

各种算术运算符只能应用于可转换为基元类型的类型的值。没有办法用泛型来表达这个需求。因此,泛型不适合此任务

对于泛型方法,而是为数值基元类型提供重载。 对于泛型类,提供使用特定数值类型的子类

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
    }
}
类数值计算器{
公共空间计算(t1,t2){
T result=one*two;//编译器错误
}
}
类LongCalculator扩展了NumericCalculator{
公共空间计算(长一、长二){
长结果=1*2;//是
}
}

使用运算符的实现必须位于知道实际类型的子类中。

各种算术运算符只能应用于可转换为基元类型的类型的值。没有办法用泛型来表达这个需求。因此,泛型不适合此任务

对于泛型方法,而是为数值基元类型提供重载。 对于泛型类,提供使用特定数值类型的子类

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
    }
}
类数值计算器{
公共空间计算(t1,t2){
T result=one*two;//编译器错误
}
}
类LongCalculator扩展了NumericCalculator{
公共空间计算(长一、长二){
长结果=1*2;//是
}
}

使用运算符的实现必须位于知道实际类型的子类中。

各种算术运算符只能应用于可转换为基元类型的类型的值。没有办法用泛型来表达这个需求。因此,泛型不适合此任务

对于泛型方法,而是为数值基元类型提供重载。 对于泛型类,提供使用特定数值类型的子类

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
    }
}
类数值计算器{
公共空间计算(t1,t2){
T result=one*two;//编译器错误
}
}
类LongCalculator扩展了NumericCalculator{
公共空间计算(长一、长二){
长结果=1*2;//是
}
}

使用运算符的实现必须在知道实际类型的子类中。

Nope。这对泛型不起作用(除非它们被其中一个包装数字类型绑定,在这种情况下,使用泛型是无用的,因为这些类型是
final
)。这是一个家庭作业问题吗?如果是的话,你能给出这个类要求的确切措辞吗?我想@SotiriosDelimanolis已经为你的问题提供了完美的答案。然而,我认为您的困惑是由于错误的需求或设计造成的。我建议你解释一下你真正想做什么,你可能会得到有用的答案。”……我被要求使用泛型……”也许是那些提出要求的人误解了什么,因为算术不能泛型地执行。如果需要仿制药,你需要接受一个解决办法。@realponsign我也开始认为我的教授可能对他的要求措词不明确,我会给他发电子邮件,看看我是否能更清楚地理解需要什么。不。这对泛型不起作用(除非它们被其中一个包装数字类型绑定,在这种情况下,使用泛型是无用的,因为这些类型是
final
)。这是一个家庭作业问题吗?如果是的话,你能给出这个类要求的确切措辞吗?我想@SotiriosDelimanolis已经为你的问题提供了完美的答案。然而,我认为您的困惑是由于错误的需求或设计造成的。我建议你解释一下你真正想做什么,你可能会得到有用的答案。”……我被要求使用泛型……”也许是那些提出要求的人后来误解了什么