class 中的接口方法没有实现它?
Interface methods in a class that does not implement it?
public interface Iterator<T> {
// Returns true if the iterator is valid (points to an element), false otherwise.
boolean isValid();
// Returns the current element and moves forward. This method can only be called if the iterator is valid. If the iterator points to the last element, it becomes invalid after the call.
T next();
// Returns the current element and moves backwards. This method can only be called if the iterator is valid. If the iterator points to the first element, it becomes invalid after the call.
T prev();
}
在一个没有实现接口 Iterator 的 class 中,当你只能为一个接口内部的一个接口创建方法时,怎么可能创建一个方法 returns class 实施它?
public class ABC<K> implements EFG<K>{
public Iterator<K> minIt() {
//method body
//return Iterator<K> variable
}
}
包含方法minIt()
的classABC
没有实现Iterator<T>
(没有 class 实现接口 Iterator <T>
)
简单。通过制作一个实现它的class。请注意,您有一个自己想出的类型,并将其命名为 Iterator
。鉴于 java.util.Iterator
存在,这是一个 真的 坏主意。你应该选择另一个名字。
public class ABC<K> implements EFG<K> {
// Let's say this contains the items that can be iterated over.
private List<K> list = new ArrayList<K>();
class MyIterator implements my.pkg.Iterator<K> {
private int position = 0;
@Override public boolean isValid() {
return position > -1 && position < list.size();
}
@Override public K next() {
if (!isValid()) throw new NoSuchElementException();
return list.get(position++);
}
@Override public K prev() {
if (!isValid()) throw new NoSuchElementException();
return list.get(position--);
}
}
public Iterator<K> minIt() {
return new MyIterator<K>();
}
}
请注意,您放入 classes 中的 classes 只能在该 class 中的实例上下文中构造:它们有一个 'secret' 字段类型。因此,为什么 MyIterator 中的代码可以 访问外部 class.
的 list
字段
Java 有 'anonymous inner class literal' 语法,可以让你缩短这个:除了显式声明 class MyIterator
,你还可以写:
public Iterator<K> minIt() {
return new your.pkg.Iterator<K>() {
private int position = 0;
@Override public boolean isValid() {
// same code goes here as the previous snippet
}
};
}
这种匿名内部 class 形式更为常见。这只是语法糖 - 一种编写相同内容的更短方式。
您可以使用实现接口的Anonymous Class:
例如:
interface Foo<T> {
T foo();
}
class Bar<T> {
T t;
public Foo<T> bar() {
return new Foo<T>() { // <-- Anonymous class implementing `Foo`
public T foo() {
return t;
}
};
}
}
执行:
Bar<String> b = new Bar<>();
b.t = "hello"; // with a setter in real life
Foo<String> f = b.bar();
f.foo(); // will return "hello"
我认为最常见的另一个选项是使用 returns 接口的方法,例如列表接口有一个 iterator()
方法,即使它本身没有实现 Iterator
接口。
List<String> list = new ArrayList<>();
Iterator<String> stringIterator = list.iterator();
public interface Iterator<T> {
// Returns true if the iterator is valid (points to an element), false otherwise.
boolean isValid();
// Returns the current element and moves forward. This method can only be called if the iterator is valid. If the iterator points to the last element, it becomes invalid after the call.
T next();
// Returns the current element and moves backwards. This method can only be called if the iterator is valid. If the iterator points to the first element, it becomes invalid after the call.
T prev();
}
在一个没有实现接口 Iterator 的 class 中,当你只能为一个接口内部的一个接口创建方法时,怎么可能创建一个方法 returns class 实施它?
public class ABC<K> implements EFG<K>{
public Iterator<K> minIt() {
//method body
//return Iterator<K> variable
}
}
包含方法minIt()
的classABC
没有实现Iterator<T>
(没有 class 实现接口 Iterator <T>
)
简单。通过制作一个实现它的class。请注意,您有一个自己想出的类型,并将其命名为 Iterator
。鉴于 java.util.Iterator
存在,这是一个 真的 坏主意。你应该选择另一个名字。
public class ABC<K> implements EFG<K> {
// Let's say this contains the items that can be iterated over.
private List<K> list = new ArrayList<K>();
class MyIterator implements my.pkg.Iterator<K> {
private int position = 0;
@Override public boolean isValid() {
return position > -1 && position < list.size();
}
@Override public K next() {
if (!isValid()) throw new NoSuchElementException();
return list.get(position++);
}
@Override public K prev() {
if (!isValid()) throw new NoSuchElementException();
return list.get(position--);
}
}
public Iterator<K> minIt() {
return new MyIterator<K>();
}
}
请注意,您放入 classes 中的 classes 只能在该 class 中的实例上下文中构造:它们有一个 'secret' 字段类型。因此,为什么 MyIterator 中的代码可以 访问外部 class.
的list
字段
Java 有 'anonymous inner class literal' 语法,可以让你缩短这个:除了显式声明 class MyIterator
,你还可以写:
public Iterator<K> minIt() {
return new your.pkg.Iterator<K>() {
private int position = 0;
@Override public boolean isValid() {
// same code goes here as the previous snippet
}
};
}
这种匿名内部 class 形式更为常见。这只是语法糖 - 一种编写相同内容的更短方式。
您可以使用实现接口的Anonymous Class:
例如:
interface Foo<T> {
T foo();
}
class Bar<T> {
T t;
public Foo<T> bar() {
return new Foo<T>() { // <-- Anonymous class implementing `Foo`
public T foo() {
return t;
}
};
}
}
执行:
Bar<String> b = new Bar<>();
b.t = "hello"; // with a setter in real life
Foo<String> f = b.bar();
f.foo(); // will return "hello"
我认为最常见的另一个选项是使用 returns 接口的方法,例如列表接口有一个 iterator()
方法,即使它本身没有实现 Iterator
接口。
List<String> list = new ArrayList<>();
Iterator<String> stringIterator = list.iterator();