Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个代码是做什么的?(Java集合)_Java_Collections - Fatal编程技术网

这个代码是做什么的?(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); } }

我一直在用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); }
}
我不明白这是怎么回事:

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,以获取详细解释