2016-06-29 112 views
1

是否有可能通過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{} 

我放了一堆貓狗的寵物到接受寵物鏈表。我想通過查找最後一個DOG索引:

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

是否可以這樣做?通過對象的類型引用對象?

+4

不可以。您可以向後迭代列表,並測試對象是否爲該類型的引用 - 但是List沒有內置方法來執行此操作。 –

+0

太棒了。我實際上試圖問你是否可以測試這個對象是否是一個類型的引用!作爲答案,我可以標記這個解決?使用getclass()。 – lawonga

+1

@lawonga或者instanceof。 – immibis

回答

1

假設你正在使用Java 8中,可以filter出所有非DOG s中最後一隻狗然後搜索:

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); 
} 

Here的,我投了兩個DOG個例子和三個CAT s到列表中,並接收我放入集合中的第二個DOG。您可以通過更改dogList.get()中的內容來擴大此範圍以刪除nDOG

1

它可能在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(請注意,顯式類型參數沒有嚴格要求。)

這是通過使用仿製藥和類方法isAssignableFrom檢查列表中的對象類型與所需的類型相對應。

1

使用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))); 
    } 

}