【问题标题】:Get items from an array of specific oftype in Java从Java中特定类型的数组中获取项目
【发布时间】:2020-08-19 14:36:33
【问题描述】:

在 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的类型是什么?

【问题讨论】:

    标签: java generics lambda


    【解决方案1】:

    在 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 类的实例。您将无法在运行时区分其中两个对象,因为类型参数已被删除。您可以做的是定义专门的类来表示不同类型的“接收”对象。例如:class TestReceives extends Receives&lt;TestMessage&gt;

    【讨论】:

    • 谢谢。是否可以为 typeReceives&lt;TestMessage&gt; 打电话给getTheDarnThing
    • 是的,但它不会按照您想要的方式工作 - 我已经编辑了问题以添加解释。
    猜你喜欢
    • 2022-12-12
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多