Проблема с интерфейсами в Java - PullRequest
2 голосов
/ 16 октября 2010

Я работаю над таблицей упражнений, касающейся интерфейсов, обобщений и абстрактных классов в Java. Независимо от того, каким образом я, кажется, кодирую это, класс Exercise1 не будет работать. Заданный вопрос комментируется в коде. Любая помощь будет принята с благодарностью, я не уверен, что ошибка в коде Упражнения 1 или реализации интерфейса в классах Time and Point.

/*Exercise 2

(a)     Write an interface Printable which has a single method put whose intention is to display a string representation of any object whose class implements Printable. Check it by compiling it. */

interface Printable {

        public void put(Object o);

}

/*(b)   Enhance classes  Point and Time from Chapter 2 of the notes to implement Printable. Check them by compiling them. */

class Point implements Printable {

        static Scanner sc = new Scanner(System.in);

        private double x, y; // coordinates

        Point(double x, double y){ // all-args constructor
            this.x = x; this.y = y;
        }

        Point(){}; // no-args constructor (defaults apply)

        void get() {
            x = sc.nextDouble();
                y = sc.nextDouble();
        }

        public String toString() {
                return "(" + x + "," + y + ")";
        }

        double distance(Point r) { // distance from r
                double xdist = x-r.x; double ydist = y-r.y;
                return(Math.sqrt(xdist*xdist+ydist*ydist));
        }

        public void put(Object o) {

                if(o==null) return;
                Point p = (Point)o;
                System.out.println(x + ":" + y);
        }

}


class Time implements Order, Printable {

        private int hours; // 0..23
        private int mins; // 0..59


        Time() { }

        Time (int hours, int mins) {

                this.hours = hours;
                this.mins = mins;

        }

        public boolean lte(Object other) { // Note public
           if (other==null) return false;
           Time t = (Time) other;
           return hours*60+mins<=t.hours*60+t.mins;
        }

        public void put(Object o) {

                if(o==null) return;
                Time t = (Time)o;
                System.out.printf("%02d:%02d\n", t.hours, t.mins);
        }
}

/*(c)   Write a static method print which takes an array of objects whose class implements Printable, and prints each element in  the array, one element per line. Check it by placing it in an otherwise empty class and compiling it.  */

//this is the bit that is giving me grief, I've tried :

public class Exercise1 {

        static void print(Printable[] a) {

        for(int i = 0; i < a.length ; i++) {

                a[i].put(); // put(java.lang.Object) in Printable cannot be applied to ()                                                    //a[i].put();


                }

        }

        public static void main(String[] args) {

                Time[] t = new Time[10];
                for(int i = 0; i < t.length; i++) {
                        t[i] = new Time();
                }
                print(t);

        }
}

public interface  Order {
    boolean lte (Object obj); // Object for max generality
    // is this object less than or equal to obj?
}

Ответы [ 4 ]

1 голос
/ 16 октября 2010

Мне кажется, проблема в интерфейсе Printable.Это не соответствует вопросу правильно.

для отображения строкового представления любого объекта, класс которого реализует Printable

Это не означает, что метод put() должен иметь параметр типа Object.

Объект здесь ссылается на this, объект, класс которого реализует Printable.И метод put() должен распечатать строковое представление this.Так что в простейшем случае вы можете реализовать это с помощью toString().

interface Printable {
  /**
   * Display a string representation of this
   */
  void put();
}

class Point implements Printable {

  // ...

  /**
   * returns a string representation of this
   */
  public String toString() {
    return "(" + x + "," + y + ")";
  }

  public void put() {
    // this is the same as System.out.println(this.toString());
    System.out.println(this); 
  }
}

Затем вы можете вызвать put() для каждого Printable в вашем массиве.

1 голос
/ 16 октября 2010

Вы хотите напечатать this, а не какой-либо произвольный объект o.

0 голосов
/ 16 октября 2010

Что вы хотите сделать, это сделать интерфейс Printable похожим на это:

interface Printable {

    public void print(); //The name of the method should be similar to the name of the interface
}

Тогда ваши классы будут работать так:

public class Time implements Printable {

    private int hours, minutes;

    public void print() {
        System.out.println( hours + ":" + minutes );
    }
}

Для упражнения 1 вы должны вызвать print() для каждого элемента массива.

Кстати: интерфейс уже похож на Order. Он называется Comparable и выглядит так:

public interface Comparable<T> {

    public void compareTo(T other); //Returns -1 if less than, 0 if equal, and 1 if greater than other object.

}

Если параметр T не задан, он становится Object.

0 голосов
/ 16 октября 2010

вы можете захотеть, чтобы ваш метод печати был print (Object object), а не put.

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