簡體   English   中英

通過對象類型Java引用

[英]Referencing by an object type Java

是否可以通過Java中的類型引用對象?

例如,我有這個:

private static class Pet {
    private String name;

    public String getName() {
        return name;
    }

    public Pet setName(String name) {
        this.name = name;
        return this;
    }
}

public static class CAT extends Pet{}

public static class DOG extends Pet{}

我把一堆CATS和DOGS寵物放入一個接受寵物的鏈接列表中。 我想通過以下方式找到DOG的最后一個索引:

        private Pet dequeueDog() {
        int locationDog = linkedList.lastIndexOf(DOG);
        return linkedList.remove(locationDog);
    }

有可能這樣做嗎? 通過對象類型引用對象是什么?

假設您正在使用Java 8,您可以filter掉所有非DOG以找到最后一只狗然后搜索它:

private static Pet dequeueDog(LinkedList<Pet> linkedList) {

    List<Pet> dogList = linkedList.stream().filter(u -> u.getClass() == DOG.class).collect(Collectors.toList());
    int locationDog = linkedList.lastIndexOf(dogList.get(dogList.size()-1));
    return linkedList.remove(locationDog);
}

是一個例子,我將兩個DOG和三個CAT放入列表中,並接收我放入集合中的第二個DOG 您可以通過更改放入dogList.get()來擴展此以刪除第nDOG

它有可能在Java中,但有點難看。 給定一個要搜索的列表和類型,這是一個可以執行此操作的方法。

public static <T> T getLastOfType(List<? super T> list, Class<T> type) {
    Object[] arr = list.toArray();
    for (int i = arr.length - 1; i >= 0; i--) {
        if (arr[i] == null) continue;

        if (type.isAssignableFrom(arr[i].getClass())) {
            return (T) arr[i];
        }
    }
    return null;
}

以下是對它的實際應用的一點測試: http//pastebin.com/yX1v6L9p (注意,不嚴格需要顯式類型參數。)

這通過使用泛型和Class方法isAssignableFrom來檢查列表中對象的類型與所需類型。

像這樣使用instanceof

package com.example;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class ExampleTest {

    class Pet {
    }

    class CAT extends Pet {
    }

    class DOG extends Pet {
    }

    private Pet dequeueDog(List<Pet> linkedList) {
        int i = 0;
        Integer foundIndex = null;
        DOG found = null;
        for (Pet pet : linkedList) {
            if (pet instanceof DOG) {
                foundIndex = i;
                found = (DOG) pet;
            }
        }
        if (foundIndex != null) {
            linkedList.remove(foundIndex);
        }
        return found;
    }

    @Test
    public void test() {
        DOG someDog = new DOG();
        CAT someCat = new CAT();
        assertEquals(someDog, dequeueDog(Arrays.asList(someCat, someDog, null, someDog, someCat)));
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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