2016-06-29 11 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で検索したい:

これは可能ですか?オブジェクトのタイプでオブジェクトを参照するには?

+4

いいえリストを逆方向に反復し、そのオブジェクトがその型の参照であるかどうかをテストできますが、 'List'にはそれを行う組み込みメソッドがありません。 –

+0

すばらしい。私は実際にオブジェクトが型の参照であるかどうかをテストできるかどうか尋ねようとしていました!私はこれを解決してマークすることができるように答えてください? getclass()の使用 – lawonga

+1

@lawongaまたはinstanceof。 – immibis

答えて

1

は、Java 8を使用していると仮定すると、あなたはそれを探し、最後の犬を見つけるために、すべての非DOG Sをfilterことができます。

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さん私は2つのDOG Sに入れ例リストには3つのCATがあり、2番目のDOGを受け取ってセットに入れました。これを拡張して、dogList.get()に入れた内容を変更してnthを削除することができます。

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

} 
関連する問題