Java:根据我的课程校正器,为什么这是错的?

时间:2014-03-25 22:01:45

标签: java types queue

我为以下决定丢失了10%(将我的que作为对象实例化,而不是整数类型),我不确定为什么?也许有人能看出原因?

我在这里实例化了#my; myQueue2"作为对象类型。

Queue<Object> myQueue2 = new LinkedQueue<Object>(); 

接下来,我将一些整数排队并出列

try {
            myQueue2.enqueue(10);
            System.out.println(myQueue2);
            myQueue2.enqueue(5);
            System.out.println(myQueue2);
            myQueue2.dequeue();
int total = 0;
            while (!myQueue2.isEmpty()) {
                total +=  (int)myQueue2.dequeue();
            }
            System.out.println("The Queue's remain elements added to: " + total);
    } catch (QueueEmptyException ex) {
        System.out.println("Stack Empty Error");
    }

根据我的评分者的问题是我本应该将我的队列实例化为Integer类型。起初他们认为它没有编译,因为他们没有使用Java 7,这条线在Java 7之前是非法的:

total +=  (int)myQueue2.dequeue();

在我解释之后,他们仍然说我应该将Queue实例化为Integer类型。

但是,我的逻辑是我可以将字符串排入队列。字符和整数通过将其实例化为一个Object然后将其作为一个(int)在此行中转换:(当我尝试尝试时它才有效)     total + =(int)myQueue2.dequeue();

我认为我的方法更灵活,不是吗? 他们选择在这里使用对象有什么优点和缺点,我不能完全得到它?

3 个答案:

答案 0 :(得分:3)

使用“盲目铸造”或实例通常是非常糟糕的方法。使用正确的类型允许编译器在运行程序之前查找错误。

此外,它可以帮助您轻松找到您的实例用途(想象一下,您在一两年后看到您的代码,并且您看到Queue<Object> myQueue2 = new LinkedQueue<Object>();,您应该如何知道,它用于整数?

答案 1 :(得分:1)

当您选择该类的参数时,您正在设置限制。由于java中的所有内容都是Object(更像是基元之类的东西),因此您将能够在该数组中存储任何Type。

您的老师只希望您能够在该阵列中存储整数。由于没有任何事情妨碍您进行myqueue.add("Im a string, not an integer");,因此您的老师会将这些要点停靠在您身上。

示例:

class Car { }

ArrayList<Car> carlist = new ArrayList<Car>();

如果我尝试carlist.add("Hey");,则会抛出错误,因为String不会扩展Car。如果我有

class Benz extends Car { }

我可以做carlist.add(new Benz());,因为奔驰是一辆汽车。

每个班级都属于Object的等级,所以你可以在那里放任何东西。

提示:像String和Integer这样的类是final,所以没有什么可以扩展这些类。

答案 2 :(得分:0)

你可以在它编译的意义上放入字符串,但是当你输入除Integer以外的任何东西然后将它强制转换为int时,你将在运行时获得异常。所以你已经用运行时错误替换了编译时错误,这很糟糕。