public boolean contains(Object o) {
for (E x : this)
if (x.equals(o))
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
有人能告诉我这段代码中有什么令人兴奋的意思吗?没有这个可以写它怎么样?
Psh*_*emo 22
这里this表示调用当前方法的对象.例如,如果你有a.contains(x)内部contains方法this将返回对a引用变量中保存的同一对象的引用.
由于您可以this在for-each中使用它意味着该contains方法被放置在实现Iterable<E>接口的类中,因为for-each只能遍历:
String[] array = ...; for(String s : array){...}Iterable<E>就像List<String>我们可以编写的那样实现for(String s : list){...}为了避免this您可以显式添加包含此方法的类的方法参数,例如
public boolean contains(YourClass yc, Object o) {
//and use that parameter in loop instead of `this`
for (E x : yc)
if (x.equals(o))
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
但这意味着你需要以某种方式调用这样的方法,a.contains(a,x)因此它需要重复a两次(更不用说它可以让我们传递我们类的其他实例而不是a像a.contains(b,x)).
为了避免这种重复,我们可以制作允许通过它调用它的contains方法.但是这样我们需要从一个基本的OOP概念 - 多态 - 辞职,因为它不适用于方法.staticYourClass.contains(a,x)static
编译器使用第一个解决方案来解决它,所以它编译我们的方法就像编写它们一样(我们实际上可以用这种方式编写方法)
public boolean contains(YourClass this, Object o) {
// ^^^^^^^^^^^^^^
...
}
Run Code Online (Sandbox Code Playgroud)
然后当我们编写a.contains(x)它时,就像我们要调用一样编译它a.contains(a,x).
this是包含contains()方法的类的对象.它指的是执行该方法的该类的对象.
将它放在:增强的for循环之后意味着包含此方法的类必须实现Iterable<E>,因为增强的for循环可用于迭代实现Iterable接口的类或实例.这意味着您的类能够迭代某些E元素集合.E可能是泛型类型参数.
为了编写你的方法this,你必须提供一个实现的替代对象的引用Iterable<E>,但我没有看到这样做的意义.