0

我正在尝试为一个名为的类编写一个简单的程序,该类Number需要一个通用参数。我的想法是我想将这些存储起来NumberList以便我可以遍历它并找到总和。

我的列表将是 [2,3.4,4,5] 类型。那是 int, doubles 的混合。我当前的代码在 import java.util.* 下面;

class Number<T> {
    T n;
    Number(T n) {
        this.n=n;
    }
    public T getnumber(){
        return n;
    }

    public String toString() {
        return n.toString();
    }
}

public class GenericsWildcards {

    public static void main(String[] args) {
        Number num1=new Number(5);
        Number num2= new Number(5.4);
        Number num3=new Number(1.2);
        List<Number> list=new ArrayList<Number>();
        list.add(num1);
        list.add(num2);
        list.add(num3);
        System.out.println(list);//prints correctly
        double sum=0;
        for (Number i : list){
            sum+=i.getnumber();//compile error here
        }
        System.out.println("sum is "+ sum);
        }

    }

sysout 正确打印列表,但我无法打印,getnumber因为它返回 type Object。我试着把它加倍,sum+=(Double)i.getnumber();但仍然没有帮助。我怎样才能解决这个问题?非常感谢任何改进更好实施的想法。谢谢

4

4 回答 4

1

您在创建 Number 实例时省略了泛型类型参数,这就是它们返回 Objects 的原因。

您是否知道 Java 的 API 已经有一个 Number 类,它是所有原始数字类型(Integer、Float、Double、Long 等)的所有引用类型的超类?

于 2013-08-16T02:53:19.533 回答
1

您不需要创建自己的 Number 类来完成此操作。在自动装箱的帮助下,您可以使用 Number 的 Java 库类来完成此操作。

        public static void main(String[] args) {
            List<Number> list = new ArrayList<Number>();
            list.add(5);
            list.add(5.4);
            list.add(1.2);

            System.out.println(list);

            double sum = 0;
            for(Number i : list){
                sum += i.doubleValue();
            }

            System.out.println("sum is " + sum);
        }

我使用 doubleValue() 将数字相加,同时保留小数信息。

于 2013-08-16T03:04:07.690 回答
0

您将 Number 用作原始类型(您没有指定 T),因此所有遗传方法都恢复为 Object,这就是getNumber()为您返回 Object 的原因。

第 1 步:扔掉你的 Number 类,改用 java 类java.lang.Number

第 2 步:使用自动装箱:

Number num1 = 5; // Integer
Number num2 = 5.4; // Double
Number num3 = 1.2; // Double

doubleValue()第 3 步:将列表中数字的返回值相加

于 2013-08-16T02:57:49.907 回答
0

你不想要泛型,你可能想要子类化,即使那样你也需要包装求和操作。例如,给定你的代码,你真正想要写的是

Number<Integer> num1 = new Number<Integer>(5);
Number<Double> num2 = new Number<Double>(5.4);

请注意我们必须如何为泛型提供类型,也就是说num1is aNumber<Integer>num2is a Number<Integer>,但是如果我们想创建一个列表,这会导致问题,因为num1andnum2是不同的类型。

因为Java并不总是有泛型,像List、ArrayList等类过去只接受对象,因此如果你不传入类型,它默认为对象。因此您的代码相当于

Number<Object> num1 = new Number<Object>(5);
Number<Object> num2 = new Number<Object>(5.4);
...
List<Number<Object>> list = new ArrayList<Number<Object>>();

实际上,用 Java 实现您所描述的内容是不可能的,但是这是可取的,因为否则在编译时就不可能知道什么是类型i.getnumber(),因此程序无法进行类型检查(它应该如何知道您只添加整数和双精度数)。

PS您可能正在寻找访问者模式http://en.wikipedia.org/wiki/Visitor_pattern#Java_example

于 2013-08-16T03:01:57.657 回答