我想知道是否可以将一个类的泛型类型定义为作为参数传递的另一个对象的泛型类型?
我正在做的是一个线程安全的迭代器,这样多个线程就可以安全地迭代一个列表,而不会有两个线程获得相同的对象。它在当前形式下运行良好,但我认为它可以做得更好。
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
只存在于构造函数的范围内。
有谁知道一个干净整洁的方法来做到这一点?
最佳答案
向 AtomicIterator 添加泛型,以及(如果在 Java 6 下运行)静态工厂方法,因此它默认解析泛型
public class AtomicIterator<T> implements Iterator<T>
{
private Iterator<T> it;
public AtomicIterator(Iterable<T> iterable)
{
it = iterable.iterator();
}
public static <T> AtomicIterator<T> create ( Iterable<T> iterable )
{
return new AtomicIterator( iterable )
}
public T next()
{
synchronized(it)
{
if(it.hasNext())
return it.next();
else
return null;
}
}
}
用法如下:
ArrayList<String> someList = new ArrayList<String>;
AtomicIterator<String> it = AtomicIterator.create(someList);
关于java - 能否从构造函数参数的泛型类型推断出泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15821574/