Java: непроверенный вызов, чтобы сравнить (T) - PullRequest
4 голосов
/ 04 августа 2011
 1  class test {
 2      public static int compare0(Comparable x, Comparable y) {
 3          return x.compareTo(y);
 4      }

 5      public static int compare1(Object x, Object y) {
 6          return ((Comparable) x).compareTo((Comparable) y);
 7      }

 8      public static int compare2(Object x, Object y) {
 9          Comparable p = (Comparable) x;
10          Comparable q = (Comparable) y;
11          return (p).compareTo(q);
12      }

13      public static void main(String[] args) {
14          Comparable zero = new Integer(0);
15          Comparable one = new Integer(1);
16          int c = (zero).compareTo(one);
17      }
18  }

При компиляции кода выше выдается 4 предупреждения:

% javac -Xlint:unchecked test.java
test.java:3: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    return x.compareTo(y);
                      ^
test.java:7: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    return ((Comparable) x).compareTo((Comparable) y);
                                     ^
test.java:13: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    return (p).compareTo(q);
                        ^
test.java:19: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    int c = (zero).compareTo(one);
                            ^
4 warnings

Я перепробовал еще много вариантов, но предупреждения остались.Как правильно написать и вызвать метод test.compare выше?

Спасибо!

PS: test.compare - только пример;Мне не нужна такая функция;но мне нужно реализовать функцию, которая, как и test.compare, должна иметь в своей сигнатуре объекты, реализующие Comparable.

PS2: я программирую уже более 25 лет, я даже некоторое время программировал на Javaоколо 10 лет назад, но использование Java сейчас (требуется моей работой) приводит меня в бешенство.Для опытного программиста изучение Java гораздо сложнее, чем кажется.Существует так много вещей, связанных с изучением Java, 99% которых в лучшем случае устарели или имеют тенденцию оценивать новичков в программировании (т. Е. Очень многословны), а в худшем - просто мусор ... Мне еще предстоит найти ссылкуJava, которая позволит мне быстро обнулить ответ на вопрос выше.

Ответы [ 4 ]

6 голосов
/ 04 августа 2011

Вы должны объявить метод compare с общим аргументом.

public class ThisTest
{
    public static <T extends Comparable<T>> int compare(T x, T y) {
        if (x == null) 
            return -(y.compareTo(x));
        return x.compareTo(y);
    }

    public static void main()
    {
        // Type inferred
        int c = compare(Integer.valueOf(0), Integer.valueOf(1));
        // Explicit generic type parameter
        c = ThisTest.<Integer>compare(Integer.valueOf(0), Integer.valueOf(1));
    }
}
6 голосов
/ 04 августа 2011

Comparable является общим - вы должны определить переменные с помощью Comparable<Integer>

2 голосов
/ 11 декабря 2012

Настоящая проблема в том, что вы пытаетесь сделать сравнение в статическом методе.Сделайте метод, который делает сравнение нестатичным, создайте экземпляр одного или нескольких объектов «тестера» и передайте тип для каждого.Например:

 test<String> strTester = new test<String>();

, чтобы затем вызвать метод сравнения для объектов String:

 int retCode = strTester.comp(a, b)

Если вы хотите сравнить другие типы объектов, такие как целые числа, вам потребуется новый объект-тестеркак:

 test<Integer> intTester = new test<Integer>();

Если вы готовы сделать это, тогда ваш класс может быть определен следующим образом:

 class test<T extends Comparable<T>> {
      public int comp(T x, T y) {
           ...
      }
 }
1 голос
/ 04 августа 2011

Объявите zero и one как Integer или Comparable<Integer> вместо необработанных типов.

Анжелика Лангер создала отличный справочник по дженерикам. Она организована какиерархические часто задаваемые вопросы и должны позволить вам быстро найти конкретные ответы на большинство типовых проблем.В этом случае может оказаться полезным раздел для необработанных типов .

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