私は現在、受講している Java プログラミング コースの宿題に取り組んでいます。正確な答えを求めているわけではありませんが、いくつかのガイダンスを求めています。
私が取り組んでいる問題はこれです:
Filter インターフェイスを実装するフィルタ クラスがあります。このインターフェイスにはメソッドが 1 つだけあります。matches(T element)
渡された Integer の素数をチェックするようにフィルター メソッドを構成しました。
フィルターを通過したオブジェクトのみを表示するようにコレクション クラスを装飾するデコレーター クラスもあります。
contains(Object o) メソッドを正しく動作させるのに問題があります。
基本的contains(Obj o)
に、クラス内のメソッドは、 FilteredCollection
まずオブジェクトがフィルターを通過するかどうかを確認し、通過する場合は、contains()
そのオブジェクトの装飾されていないメソッドを呼び出す必要があります。
このクラスを多くの異なるタイプのフィルターで使用できるようにしたい場合FilteredCollection
、どのタイプのオブジェクトが渡されているかを判断し、そのオブジェクトを現在実装されているフィルターに渡すことができるようにするにはどうすればよいでしょうか。
これが私のPrimeNumberFilter
クラスです:
public class PrimeNumberFilter implements Filter<Integer> {
public boolean matches(Integer e) {
int n = e.intValue();
if (n != 2 && n % 2 == 0) {
return false;
}
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
次に、短縮されたFilteredCollection
クラスを次に示します。
class FilteredCollection<T> implements Collection<T> {
Collection<T> fc;
Filter<T> currentFilter;
private FilteredCollection(Collection<T> coll, Filter<T> filter) {
this.fc = coll;
this.currentFilter = filter;
}
public static <T> FilteredCollection<T> decorate(Collection<T> coll,
Filter<T> filter) {
return new FilteredCollection<T>(coll, filter);
}
public boolean contains(Object o) {
//What do I do here?
return fc.contains(o);
}
contains メソッドに渡されるオブジェクトは、フィルター (この場合はPrimeNumberFilter
.
私が得ているエラーは、オブジェクトを型 T にキャストしたいということです。消去のためにこれが機能しないことはわかっています。
私はたくさんの調査を行いましたが、リフレクションを使用する必要があるという結論に至りました。
インストラクターが教えてくれる唯一のヒントは、オブジェクトには使用できるメソッドがいくつかしかなく、そのうちの 1 つを使用する必要があるということです。
ご協力いただきありがとうございます!
編集: プロジェクトの要件の 1 つは、どのメソッドでもオブジェクトを T にキャストしないことです。したがって、これらの回答は素晴らしいものですが、私はそれらのいずれも使用できません。