Max_Cohen
@Max_Cohen
Программист, который не программирует

Что означают предупреждения «unchecked method invocation» и «unchecked conversion»?

Вот снова такой пример кода, есть ошибка. Изучаю Java. Прошу помочь тех, кто разбирается.

Ссылка где можно посмотреть листинг кода 6.7. ссылка на книгу

Список ошибок:
Test.java:18: warning: [unchecked] unchecked method invocation: constructor <init> in class TreeSet is applied to given types
        TreeSet<Complex> ts = new TreeSet<>(new ComplexCompare());
                              ^
  required: Comparator<? super E>
  found: ComplexCompare
  where E is a type-variable:
    E extends Object declared in class TreeSet
Test.java:18: warning: [unchecked] unchecked conversion
        TreeSet<Complex> ts = new TreeSet<>(new ComplexCompare());
                                            ^
  required: Comparator<? super E>
  found:    ComplexCompare
  where E is a type-variable:
    E extends Object declared in class TreeSet
Test.java:18: warning: [unchecked] unchecked conversion
        TreeSet<Complex> ts = new TreeSet<>(new ComplexCompare());
                              ^
  required: TreeSet<Complex>
  found:    TreeSet
3 warnings


Test.java
import java.util.*;
class ComplexCompare implements Comparator {
    public int compare(Object obj1, Object obj2) {
        Complex z1 = (Complex) obj1, z2 = (Complex) obj2;
        double re1 = z1.getRe(), im1 = z1.getIm();
        double re2 = z2.getRe(), im2 = z2.getIm();
        if (re1 != re2) return (int)(re1 - re2);
        else if (im1 != im2) return (int)(im1 - im2);
        else return 0;
    }
    public boolean equals(Object z) {
        return compare(this, z) == 0;
    }
}

class Test {
    public static void main(String[] args) {
        TreeSet<Complex> ts = new TreeSet<>(new ComplexCompare());
        ts.add(new Complex(1.2, 3.4));
        ts.add(new Complex(-1.25, 33.4));
        ts.add(new Complex(1.23, -3.45));
        ts.add(new Complex(16.2, 23.4));
        Iterator it = ts.iterator();
        while (it.hasNext()) {
            ((Complex) it.next()).pr();
        };
    }
}


Complex.java
class Complex {
    private static final double EPS = 1e-12; // Точность вычислений
    private double re, im; // Действительная и мнимая часть
    // Четыре конструктора 
    Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }
    Complex(double re) {
        this(re, 0.0);
    }
    Complex() {
        this(0.0, 0.0);
    }
    Complex(Complex z) {
        this(z.re, z.im);
    }
    // Методы доступа
    public double getRe() {
        return re;
    }
    public double getIm() {
        return im;
    }
    public Complex getZ() {
        return new Complex(re, im);
    }
    public void setRe(double re) {
        this.re = re;
    }
    public void setIm(double im) {
        this.im = im;
    }
    public void setZ(Complex z) {
        re = z.re;
        im = z.im;
    }
    // Модуль и аргумент комплексного числа
    public double mod() {
        return Math.sqrt(re * re + im * im);
    }
    public double arg() {
        return Math.atan2(re, im);
    }
    // Проверка: действительное число?
    public Boolean isReal() {
        return Math.abs(im) < EPS;
    }
    public void pr() { // Вывод на экран 
        System.out.println(re + (im < 0.0 ? "" : "+") + im + "i");
    }
    // Переопределение методов класса Object
    public Boolean equals(Complex z) {
        return Math.abs(re - z.re) < EPS && Math.abs(im - z.im) < EPS;
    }
    public String toString() {
        return "Complex: " + re + "" + im;
    }
    // Методы, реализующие операции +=, -=, *=, /=
    public void add(Complex z) {
        re += z.re;
        im += z.im;
    }
    public void sub(Complex z) {
        re -= z.re;
        im -= z.im;
    }
    public void mul(Complex z) {
        double t = re * z.re - im * z.im;
        im = re * z.im + im * z.re;
        re = t;
    }
    public void div(Complex z) {
        double m = z.mod();
        double t = re * z.re - im * z.im;
        im = (im * z.re - re * z.im) / m;
        re = t / m;
    }
    // Методы, реализующие операции +, -, *, /
    public Complex plus(Complex z) {
        return new Complex(re + z.re, im + z.im);
    }
    public Complex minus(Complex z) {
        return new Complex(re - z.re, im - z.im);
    }
    public Complex asterisk(Complex z) {
        return new Complex(
            re * z.re - im * z.im, re * z.im + im * z.re);
    }
    public Complex slash(Complex z) {
        double m = z.mod();
        return new Complex((re * z.re - im * z.im) / m, (im * z.re - re * z.im) / m);
    }
}
  • Вопрос задан
  • 501 просмотр
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Корень проблемы в том, что для обучения вы используете учебник по Java 2, а в сентябре прошлого года вышла Java 9. Между этими версиями прошло больше 15 лет и в языке многое поменялось. В частности в Java 5 появились средства обобщённого программирования и collections framework. С тех пор использование сырых типов не рекомендуется, эту возможность сохранили только для обратной совместимости. Как и старые коллекции, типа Vector. О чём вас компилятор и предупреждает.
Ответ написан
Комментировать
xez
@xez Куратор тега Java
TL Junior Roo
У меня, кстати, и так все компилируется и работает.
Предлагаю два варианта решения:
1. Т.к. класс ComplexCompare, похоже, нигде больше не используется (и вряд ли будет) перенести его как анонимный в инициализацию TreeSet:
TreeSet<Complex> ts = new TreeSet<>(new Comparator<Complex>() {
            @Override
            public int compare(Complex o1, Complex o2) {
                double re1 = o1.getRe(), im1 = o1.getIm();   //Все это можно упростить.
                double re2 = o2.getRe(), im2 = o2.getIm();
                if (re1 != re2) return (int)(re1 - re2);
                else if (im1 != im2) return (int)(im1 - im2);
                else return 0;
            }
        });


2. Сделать класс Complex implements Comparable и добавить соответствующий метод compareTo с аналогичным кодом: тогда и компараторы дополнительные не потребуются.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы