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

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

在c#中,使用 Linq :

  1. class SimpleIoC
  2. {
  3. object[] registrations = new object[] {
  4. new ServiceA(), new ServiceB(), new ServiceC(), new ServiceA()
  5. };
  6. public IEnumerable<T> GetAll<T>() => registrations.OfType<T>();
  7. }
  8. var ioc = new SimpleIoC();
  9. var serviceAs = ioc.GetAll<ServiceA>();

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

  1. @Test
  2. public void Testing_stuff() {
  3. ArrayList<Receives<?>> receivers = new ArrayList<>();
  4. receivers.add(new TestReceiver("I picked a bad day to give up learning java..."));
  5. Iterable<Receives<TestMessage>> all = getTheDarnThing(receivers);
  6. }
  7. private <T> Iterable<T> getTheDarnThing(ArrayList<?> list) {
  8. // help me obi-wan kenobi...
  9. return list.stream()
  10. .filter(x -> T.class.isAssignableFrom(x.getClass()))
  11. .map(x -> (T) x) // unchecked
  12. .collect(Collectors.toList());
  13. }

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

noj0wjuj

noj0wjuj1#

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

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

您可以这样使用它:

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

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

相关问题