java – 可以从构造函数参数的泛型类型推断泛型类型吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 可以从构造函数参数的泛型类型推断泛型类型吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2231字,纯文字阅读大概需要4分钟。
内容图文
我很想知道一个类的泛型类型是否可以通过作为参数传递的另一个对象的泛型类型来定义?
我正在研究的是线程安全迭代器,因此多个线程可以安全地通过列表迭代,没有两个线程获得相同的对象.它的当前形式效果很好,但我认为它可以做得更好.
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 – 可以从构造函数参数的泛型类型推断泛型类型吗?全部内容,希望文章能够帮你解决java – 可以从构造函数参数的泛型类型推断泛型类型吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。