java - 能否从构造函数参数的泛型类型推断出泛型类型?

标签 java generics constructor

我想知道是否可以将一个类的泛型类型定义为作为参数传递的另一个对象的泛型类型?

我正在做的是一个线程安全的迭代器,这样多个线程就可以安全地迭代一个列表,而不会有两个线程获得相同的对象。它在当前形式下运行良好,但我认为它可以做得更好。

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/

相关文章:

java - 使用与子类构造函数不同的参数调用基类构造函数

java - 如何从MYSQL数据库中获取数据并显示在应用程序中?

java - 在 Java 中,如何将一小段黑色文本拆分为 Arraylists?

JavaFX:创建具有泛型类型的动态 TableView

swift - 无法使用可编码通用参数调用函数

javascript - 有人可以澄清原型(prototype)和构造函数这两个词的歧义吗?

java - 通过 Spring LDAP 更改 Active Directory 密码

java - GWT:如何在服务器和客户端(Gin/Guice)上格式化数字

c# - AddRange 授予公众访问列表的权限

C++ 调用不同的类构造函数,避免切换