[英]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()
來擴展此以刪除第n
個DOG
。
它有可能在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.