这个代码是做什么的?(Java集合)
我一直在用Java学习思考。我发现了以下代码:这个代码是做什么的?(Java集合),java,collections,Java,Collections,我一直在用Java学习思考。我发现了以下代码: class SetType { int i; public SetType(int n) { i = n; } public boolean equals(Object o) { return o instanceof SetType && (i == ((SetType)o).i); } public String toString() { return Integer.toString(i); } }
class SetType {
int i;
public SetType(int n) { i = n; }
public boolean equals(Object o) {
return o instanceof SetType && (i == ((SetType)o).i);
}
public String toString() { return Integer.toString(i); }
}
我不明白这是怎么回事:
i == ((SetType)o).i
我知道对象o被强制转换为SetType,但那是关于?
如果有人理解这一点,这意味着in将是好的。它访问SetType类实例的i字段。它访问SetType类实例的i字段。i正在访问该对象的成员变量i。i正在访问该对象的成员变量i。需要理解的事情这里是在一个表达式中完成两件事。第一个对象o被转换成一个SetType类的对象,这是SetTypeo部分,然后访问这个对象的字段i。将其视为以下两个步骤可能会有所帮助
SetType s = (SetType)o;
s.i;
请注意,强制转换是安全的,因为您首先测试SetType的o instanceof,并且强制转换也是必要的,因为o是类对象的实例,因此没有名为i的字段,即o.i将不起作用。为了完整起见,下面是代码的完全扩展版本:
public boolean equals(Object o) {
if (o instanceof SetType) {
SetType s = (SetType)o;
return (i == s.i);
}
return false;
}
这里要理解的是,两件事在一个表达式中完成。第一个对象o被转换成一个SetType类的对象,这是SetTypeo部分,然后访问这个对象的字段i。将其视为以下两个步骤可能会有所帮助
SetType s = (SetType)o;
s.i;
请注意,强制转换是安全的,因为您首先测试SetType的o instanceof,并且强制转换也是必要的,因为o是类对象的实例,因此没有名为i的字段,即o.i将不起作用。为了完整起见,下面是代码的完全扩展版本:
public boolean equals(Object o) {
if (o instanceof SetType) {
SetType s = (SetType)o;
return (i == s.i);
}
return false;
}
此代码:
这是一种写同样东西的等效方法的缩写形式:
public boolean equals(Object o) {
if (o instanceof SetType) {
SetType other = (SetType) o;
if (i == other.i) {
return true;
}
}
return false;
}
我希望你会觉得这更容易理解。您可以简化此代码以达到原始版本。它们是等效的。此代码:
这是一种写同样东西的等效方法的缩写形式:
public boolean equals(Object o) {
if (o instanceof SetType) {
SetType other = (SetType) o;
if (i == other.i) {
return true;
}
}
return false;
}
我希望你会觉得这更容易理解。您可以简化此代码以达到原始版本。它们是等价的。这本书说它做了什么?这只是访问SetType对象的i成员,这是强制转换o的结果。扔掉这本书。字段i应该有一个更具描述性的名称,并且可能是私有的。另外,他们犯了一个不可原谅的错误,覆盖了equals而不是hashCode。书中说它做了什么?那只是访问SetType对象的i成员,这是强制转换o的结果。扔掉书。字段i应该有一个更具描述性的名称,并且可能是私有的。另外,他们犯了一个不可原谅的错误,覆盖了equals而不是hashCode。现在我明白了。但是这种简短的编程风格是正常的吗?是的,它非常普遍。随着时间的推移,你会习惯的。原文中还有不必要的括号,这就足够了:returno instanceof SetType&&i==SetTypeo.i;一些IDE可以自动将表达式简化为这种形式,例如IntelliJThank,感谢您提供我现在理解的详细解释。但是这种简短的编程风格是正常的吗?是的,它非常普遍。随着时间的推移,你会习惯的。原文中还有不必要的括号,这就足够了:returno instanceof SetType&&i==SetTypeo.i;某些IDE可以自动将表达式简化为这种形式,例如IntelliJThank,以获取详细解释