[英]Get items from an array of specific oftype in 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
object:
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 的實例。 您將無法在運行時區分其中兩個對象,因為類型參數已被刪除。 您可以做的是定義專門的類來表示不同類型的“接收”對象。 例如: class TestReceives extends Receives<TestMessage>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.