あるクラスのジェネリック型が、パラメーターとして渡される別のオブジェクトのジェネリック型によって定義される可能性があるのだろうか?
私が取り組んでいるのはスレッドセーフなイテレータです。そのため、複数のスレッドがリストを安全にイテレータでき、2 つのスレッドが同じオブジェクトを取得することはありません。今の形でも十分に機能しますが、もう少し良くできると思います。
import java.util.Iterator;
public class AtomicIterator implements Iterator<Object>
{
private Iterator<?> it;
public AtomicIterator(Iterable<?> iterable)
{
it = iterable.iterator();
}
public Object next()
{
synchronized(it)
{
if(it.hasNext())
return it.next();
else
return null;
}
}
}
一部のコードは省略されていますが、これでアイデアが伝わるはずです。現在、次のオブジェクトを取得するには、返されたオブジェクトを常にキャストする必要がありますが、これは非効率的です。
ArrayList<String> someList = new ArrayList<String>;
AtomicIterator it = new AtomicIterator(someList);
String example = (String)it.next();
問題は明らかに、この例では型を返すために、必要な場所にit.next()
型を返すことですObject
String
簡単な解決策は、AtomicIterator
独自のジェネリック型を指定して、次のようにすることです
ArrayList<String> someList = new ArrayList<String>();
AtomicIterator<String> it = new AtomicIterator<String>(someList);
String example = it.next();
ただし、これは私にsomeList
は冗長に思えます。明示的に定義されたジェネリック型があり、与えられたオブジェクトからジェネリック型を推測しString
たいのです。AtomicIterator
Iterable
私が本当に欲しいのは、このようなものです
import java.util.Iterator;
public class AtomicIterator implements Iterator<E>
{
private Iterator<E> it;
public <E> AtomicIterator(Iterable<E> iterable)
{
it = iterable.iterator();
}
public E next()
{
synchronized(it)
{
if(it.hasNext())
return it.next();
else
return null;
}
}
}
そして、そこから次のようなことができます
ArrayList<String> someList = new ArrayList<String>();
AtomicIterator it = new AtomicIterator(someList);
String example = it.next();
しかし残念ながら、ジェネリック型E
はコンストラクターのスコープ内にしか存在しないため、これは機能しません。
これを行うためのきれいな方法を知っている人はいますか?