从java中特定类型的数组中获取项

5m1hhzi4  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(365)

在c#中,使用 Linq :

class SimpleIoC
{
    object[] registrations = new object[] {
        new ServiceA(), new ServiceB(), new ServiceC(), new ServiceA()
    };

    public IEnumerable<T> GetAll<T>() => registrations.OfType<T>();
}

var ioc = new SimpleIoC();  
var serviceAs = ioc.GetAll<ServiceA>();

这在java中可以实现吗?如果是,怎么做?

@Test
public void Testing_stuff() {
    ArrayList<Receives<?>> receivers = new ArrayList<>();
    receivers.add(new TestReceiver("I picked a bad day to give up learning java..."));

    Iterable<Receives<TestMessage>> all = getTheDarnThing(receivers);
}

private <T> Iterable<T> getTheDarnThing(ArrayList<?> list) {

    // help me obi-wan kenobi...
    return list.stream()
                .filter(x -> T.class.isAssignableFrom(x.getClass()))
                .map(x -> (T) x) // unchecked
                .collect(Collectors.toList());
}

还有,有没有可能知道 T 是否为泛型参数?

noj0wjuj

noj0wjuj1#

在java中,需要传递一些东西来将类型标识为方法的参数,因为类型参数 T 只是编译时构造。通常是 Class 使用对象:

private <T> List<T> getTheDarnThing(List<?> list, Class<T> klass) {
    return list.stream()
        .filter(klass::isInstance)
        .map(klass::cast)
        .collect(Collectors.toList());
}

您可以这样使用它:

List<Service> services = List.of(new ServiceA(), new ServiceB(), new ServiceC());
List<ServiceA> as = getTheDarnThing(services, ServiceA.class);

注意,在java代码中,列表中的所有对象都是 Receives 使用不同的类型参数初始化。在运行时您将无法区分这两个对象,因为类型参数已被删除。您可以定义专门的类来表示不同类型的“receives”对象。例如: class TestReceives extends Receives<TestMessage>

相关问题