Я получил ошибки компиляции при переопределении метода Equals, в частности, в круглых скобках Float и Double, атрибутах веса и цены, метод HashCode, похоже, работает, поэтому я не знаю, где проблема в моем коде. Код также содержит интерфейс Vehicle, но я не ожидаю, что ошибка будет из-за интерфейса. Я не уверен, что полностью понял метод Equals. Кто-нибудь может мне помочь?
package info.vehicle;
import java.io.Serializable;
public class Car implements Vehicle,Serializable,Cloneable {
private float weight;
private double price;
private String producer;
public Car()
{
}
public Car(float _weight,double _price,String _producer)
{
weight=_weight;
price=_price;
producer=_producer;
}
public void setProducer(String _producer) throws Exception
{
if (_producer!=null && _producer.length()>1)
this.producer=_producer;
else
{
throw new Exception("Producer must not be null.");
}
}
public void setPrice(double _price) throws Exception
{
if (_price>0)
{
price=_price;
}
else
{
throw new Exception("Price must not be 0.");
}
}
public void setWeight(float _weight) throws Exception
{
if (weight>0)
{
weight=_weight;
}
else
{
throw new Exception("Weight must be different than 0.");
}
}
@Override
public boolean equals(Object obj) {
Car other=(Car)obj;
if (((Float)(this.weight)).equals(Float)other.weight)
{
if ((Double)(this.price)).equals((Double)other.price))
{
if (this.producer.contentEquals(other.producer))
{
return super.equals(obj);
}
}
}
return false;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Car temp=new Car();
temp.weight=this.weight;
temp.price=this.price;
temp.producer=this.producer;
return temp;
}
@Override
public int hashCode() {
final int prime=31;
int result=0;
result+=(int)weight*prime;
result+=(int)price*prime;
result+=producer.length()*prime;
return result;
}
@Override
public String infoVehicle() {
return producer;
}
}
Какую именно ошибку вы получаете?
Джошуа Блох рассказывает вам, как правильно переопределить equals и hashCode в «Эффективной Java», глава 3: fpl.cs.depaul.edu/jriely/ds2/extras/Chapter3.pdf
Я бы не советовал вам реализовывать интерфейсы Serializable и Cloneable. Ваш учитель просит вас делать то, чего современные практикующие не делают. Никто не выполняет сериализацию в байт-код Java; лучше сериализовать в JSON или XML. Лучше написать конструктор копирования, чем клонировать; это винтажный интерфейс 1995 года, в котором было много проблем. Так больше никто не делает.




Простые синтаксические ошибки.
equals(Float)other.weight)
Должно быть
equals((Float) other.weight)
а также
if ((Double)(this.price))
должно быть
if (((Double)(this.price))
Но почему вы явно их бросаете?
@Корина, ладно. Ну ты хоть разобрался :)
@Corina, если вам действительно нужно их разыграть, используйте примитивные (плавающие, двойные), а не обертки (плавающие, двойные).
Большое спасибо, ваши инструкции действительно сэкономили мне время и нервы, и извините, что не проголосовал за ответ до того, как вы сказали мне.
@Корина, нет проблем, не беспокойся об этом.
Какие именно ошибки компиляции? Можете ли вы добавить сообщение об ошибке? Также было бы очень полезно, если бы вы отформатировали метод equals, чтобы было легче увидеть, какой блок принадлежит какой скобке.