Переопределение равно для String и Int - PullRequest
1 голос
/ 27 января 2012

У меня есть список в этом списке, я создал объект.Используя метод contains(), я хочу проверить, существует ли объект уже или нет.Для этого я переопределяю метод equals().Все идеально до этого.Но когда я пытаюсь сделать то же самое для String и int, переопределение equals() не работает.Почему это так?Я только что опубликовал пример кода для справки.

public class Test 
{
private int x;

public Test(int n) 
{ 
x = n;
}

public boolean equals(Object o) 
{
return false; 
}

public static void main(String[] args) 
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(3));
System.out.println("Test Contains Object : " + list.contains(new Test(3))); // Prints always false (Equals override)
List<String> list1 = new ArrayList<String>();
list1.add("Testing");
String a = "Testing";
System.out.println("List1 Contains String : " + list1.contains(a)); // Prints true (Equals override not working)
}
}

Ответы [ 3 ]

11 голосов
/ 27 января 2012

String и Integer являются конечными классами, поэтому вы не можете их подклассить.Поэтому вы не можете переопределить их методы equals.

Однако вы можете создать подкласс ArrayList и создать свой собственный, содержащий сборки реализации на существующем.

3 голосов
/ 27 января 2012

Нет необходимости переопределять метод equals типа Integer или String, так как они уже реализованы и работают хорошо.

Однако, если вы все равно хотите это сделать, это будет один из способов ( Шаблон делегирования ):

public class MyString {
    private String myString;

    @Override
    public boolean equals(Object o) 
        return false;
    }

    // add getter and setter for myString 
    // or delegate needed methods to myString object.
}

Конечно, тогда вы должны использовать этот класс, а не класс String в своих списках.

0 голосов
/ 22 августа 2017

Что касается ответа Тима, вы можете сделать что-то вроде этого:

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone{
    public static void main (String[] args) throws java.lang.Exception
    {
        MyString my = new MyString();
        String testString = "bb";
        my.setMyString(testString);
        System.out.println(my.equals(testString));
    }
}

class MyString {
    private String myString;

    @Override
    public boolean equals(Object o){ 
        return o.equals(myString);
    }

    public String getMyString(){
        return myString;
    }

    public void setMyString(String newString){
        myString = newString;
    }
}

Вывод true.

...