В этом коде я могу найти и подсчитать любой элемент меньше 10. Но когда дело доходит до поиска элемента, который больше 10, счетчик всегда показывает 0, даже если искомый элемент присутствует в массиве. Я использовал общий интерфейс и статические методы ... Подсчет слов работает правильно, но проблема в числах больше 10, всегда показывает 0. Вот код:

 interface FuncCounter<T>{
    int function(T[] t, T tt);
}
class Implementation{
    static<T> int equalValues(T[] t , T tt) {
        int counter = 0;
        for(int i = 0 ; i< t.length; i++) {
            if(t[i]==tt)
                counter++;
        }
        return counter;
    }
}

public class GenericMethodRef{
    static<T> int countOperation(funcCounter<T> fc , T[] t , T v) {
        return (int) fc.function(t, v);
        
    }
    public static void main(String []args) {
        Integer[] nums = {1,1,2,3,4,4,5,6122,23,4,12,44,12,12,12,44,5,6,32, 318,318,318};
        String[] words = {"one","two","three","four","four","twelve","eleven", "eleven"};
        int countNum = countOperation(Implementation::<Integer>equalValues,nums,6122);
        int countWords = countOperation(Implementation::<String>equalValues,words,"eleven");
        System.out.println("318 presence: " + countNum);
        System.out.println("'eleven' counted: " + countWords);
        
    }```
0
EpimKrit 6 Июл 2021 в 00:00

3 ответа

Лучший ответ

Это связано с тем, что вы используете AutoBoxing для целых чисел, которые превращают int в Integer, и в качестве ссылки он не будет правильно работать с оператором ==.

Вместо этого используйте метод .equals() или, еще лучше, вызов Objects.equals(t[i], tt).

Чтобы добавить, целые числа, длинные и даже строки и т.д. обычно (в большинстве JVM) хранятся / хешируются для значений int от -10 до 10, чтобы указать на ИДЕНТИЧНЫЕ объекты (== работает). Вот почему он неправильно работает с низкими числами, но не работает с более высокими числами.

2
JayC667 5 Июл 2021 в 21:08

Помните эти 3 правила

  1. == на примитивном типе данных будет сравнивать фактические значения
  2. == по ссылочному типу данных будет сравнивать, используют ли два объекта одну и ту же память или нет
  3. equals() для предопределенного класса будет сравнивать фактические значения для ссылочного типа данных. Его можно переопределить для наших собственных классов.
0
Lovesh Dongre 5 Июл 2021 в 21:12

Даже если ваш метод называется equalValues, вы не используете метод equals (), и в этом проблема: вы передаете массив Integer, класс-оболочку для него. Объекты для значений, меньших, чем предел, определенный реализацией, кэшируются, поэтому это работает для небольших чисел. Большие значения не хранятся в кеше, поэтому оператор идентификации == возвращает false.

Вы можете исправить свой код, используя вместо этого Objects.equals (t [i], tt).

Пожалуйста, прочтите разницу между == и equals в документации по Java для получения более подробной информации.

0
Axel 5 Июл 2021 в 21:13