Java 检查对象是否与传递的对象类型相同

Java 检查对象是否与传递的对象类型相同,java,Java,我有一个类A和两个扩展了A的类B和C。我有一个数组列表,其中包含所有这些类的多个实例。我是否可以有一个方法,该方法接收一个对象并返回数组列表中与给定给该方法的对象类型相同的所有对象,我将如何执行此操作?当然-您可以使用getClass()查找执行时间类型: private final List<A> allKnownValues = ...; List<A> getAllValuesOfTheSameType(A sample) { ArrayList<A

我有一个类A和两个扩展了A的类B和C。我有一个数组列表,其中包含所有这些类的多个实例。我是否可以有一个方法,该方法接收一个对象并返回数组列表中与给定给该方法的对象类型相同的所有对象,我将如何执行此操作?

当然-您可以使用
getClass()
查找执行时间类型:

private final List<A> allKnownValues = ...;

List<A> getAllValuesOfTheSameType(A sample) {
    ArrayList<A> results = new ArrayList<>();
    for (A candidate : allKnownValues) {
        if (candidate.getClass() == sample.getClass()) {
            results.add(candidate);
        }
    }
    return results;
}

虽然已经给出了答案,但我已经开始创建一个示例,作为一个例子,所以我将在这里删除此示例:

import java.util.ArrayList;
import java.util.List;

public class TypeFilterTest 
{
    public static void main(String[] args) {

        List<Object> list = new ArrayList<Object>();
        list.add(1);
        list.add(2.0f);
        list.add(3.0);
        list.add(4);
        list.add(5.0f);
        list.add(6.0);
        list.add("seven");
        list.add(null);

        System.out.println("Integers    : "+findSameType(list, Integer.class));
        System.out.println("Floats      : "+findSameType(list, Float.class));
        System.out.println("Doubles     : "+findSameType(list, Double.class));

        System.out.println("Comparables : "+findSubType(list, Comparable.class));

    }

    private static <T> List<T> findSameType(List<? super T> list, Class<T> type)
    {
        List<T> result = new ArrayList<T>();
        for (int i=0; i<list.size(); i++)
        {
            Object element = list.get(i);
            if (element != null && element.getClass().equals(type))
            {
                result.add(type.cast(element));
            }
        }
        return result;
    }

    private static <T> List<T> findSubType(List<? super T> list, Class<T> type)
    {
        List<T> result = new ArrayList<T>();
        for (int i=0; i<list.size(); i++)
        {
            Object element = list.get(i);
            if (type.isInstance(element))
            {
                result.add(type.cast(element));
            }
        }
        return result;
    }   

}
import java.util.ArrayList;
导入java.util.List;
公共类类型过滤器测试
{
公共静态void main(字符串[]args){
列表=新的ArrayList();
增加第(1)款;
列表。添加(2.0f);
列表。添加(3.0);
增加(4);
列表。添加(5.0f);
列表。添加(6.0);
列表。添加(“七”);
list.add(空);
System.out.println(“Integers:+findSameType(list,Integer.class));
System.out.println(“Floats:+findSameType(list,Float.class));
System.out.println(“Doubles:+findSameType(list,Double.class));
System.out.println(“可比数据:“+findSubType(列表,可比.class));
}

private static List findSameType(List假设您在某处有一个对象指向您的List
List yourOriginalList

如果您使用的是Java8,那么您不仅可以为B或C元素编写一个可重用的筛选方法,还可以为您想要比较的任何内容编写一个可重用的筛选方法

public List<A> getFilteredList(Predicate<A> predicate){
        List<A> filteredList = new ArrayList<A>();
        for(A value : yourOriginalList){
            if(predicate.test(value)){
                filteredList.add(value);
            }
        }
        return filteredList;
    }
公共列表getFilteredList(谓词){
List filteredList=新建ArrayList();
对于(一个值:你的原始列表){
if(谓词测试(值)){
filteredList.add(值);
}
}
返回过滤器列表;
}
要筛选B对象,请使用:

List<A> filteredListOfB = getFilteredList((value) -> value instanceof B);
List<A> filteredListOfC = getFilteredList((value) -> value instanceof C);
List filteredListOfB=getFilteredList((值)->B的值实例);
要筛选C对象,请使用:

List<A> filteredListOfB = getFilteredList((value) -> value instanceof B);
List<A> filteredListOfC = getFilteredList((value) -> value instanceof C);
List-filteredListOfC=getFilteredList((值)->C的值实例);
如您所见,您可以在
getFilteredList


(没有测试语法错误,但这里有想法)

instanceOf()
通常让你检查什么类型的东西是你有没有代码可以发布来显示你尝试过的东西?我知道instanceof,但我事先不知道我要找什么类型的,我似乎找不到一种方法来传递它谢谢你Jon这似乎适合我的需要