我想知道一个类的泛型类型是否可以由作为参数传递的另一个对象的泛型类型来定义?
我正在研究的是一个线程安全的迭代器,因此多个线程可以安全地迭代一个列表,而没有两个线程获得相同的对象。它以目前的形式运作良好,但我认为它可以做得更好。
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
只存在于构造函数的范围内。
有谁知道一个干净的方法来做到这一点?