簡體   English   中英

從 Java 中特定類型的數組中獲取項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM