如何解决从Java中特定类型的数组中获取项目
在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中,您需要传递一些信息以将类型标识为方法的参数,因为诸如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<TestMessage>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。