抱歉,如果这个问题很简单,或者以前已经回答过了,我是Java新手,在我的研究中,我找不到关于这个问题的太多信息,也还没有找到解决方案.

我有一个具有多个类的ArrayList,这些类都共享一个公共接口,在本例中该接口称为"Packable".我正在try 创建一个方法,该方法接受一个类参数并遍历此ArrayList的每个元素,returning a new list containing all the items in the original list that are of the same class as the reference parameter.

到目前为止,这是我的代码,try instanceof方法:

 public List<Packable> getOfType(Packable reference){
        List<Packable> typeOfItems = new ArrayList<>();
        for (Packable item: itemsStored) {
            if (item instanceof reference){
                typeOfItems.add(item);
            }
        }
        return typeOfItems;
    }

这是抛出一个错误,因为它还不能将引用识别为类.This question提到一种方法isAssignableFrom,其答案是:"When using instanceof, you need to know the class of B at compile time. When using isAssignableFrom() it can be dynamic and change during runtime."(感谢Marc Novakowski)

我知道,考虑到这个参数,这个类在编译时是未知的,因此我try 实现isAssignableFrom,但似乎不能真正让它工作.IDE并没有真正识别或建议它,在线上也没有太多关于该方法的内容.我试着按照Java文档建议的方式实现它,但这也不起作用:

if (reference.isAssignableFrom(item.getClass())){
                typeOfItems.add(item);
            }

任何有关调查方法的帮助或建议都将不胜感激.感谢你阅读这个问题,如果这个问题很简单,或者已经在其他地方得到了回答,我刚刚错过了,我再次表示歉意.谢谢大家

推荐答案

我不确定Packable是什么,但您似乎对这里的几个概念感到困惑.

在Java ,Packable reference does not represent the 101 concept.它表示Packable(或空)的特定实例.

换句话说,给Dog dog只狗,那就意味着狗大约是specific只狗.而不是"狗的一般概念".我们知道dog所指的具体动物至少是一只狗.可能是菲菲,邻居家的雪纳瑞.

另一方面,instanceof是关于事物的一般概念:if (fifi instanceof Dog)是你应该如何使用它.你或多或少地试图达到if (fifi instanceof rover)的类似功能,这是没有意义的.一只狗怎么可能是另一只狗的"实例"呢?答案不是‘真’或‘假’,而是这个问题本身没有意义,这就是为什么javac不编译它.它甚至不知道这意味着什么.

Java本身就是Java,它可以制造很多东西的对象.值得注意的是,包括了事物的概念.因此,就有了类java.lang.Class,其中有represent classes个实例.这里发生了一些爱丽丝式的事情:作为一个概念,类被表示为java.lang.Class个类的实例also个.

类对象(即java.lang.Class的实例)具有.isAssignableFrom方法.这实际上将另一个j.l.CLass作为参数,用于判断一个类型是否是另一个类型的子类型.从这个意义上说,链接的问题是不必要的混乱--您实际上是在寻找instanceOf method(有一个instanceof语言构造,但j.l.Class类有一个isInstance方法,这是无关的,除了它们大致实现了相同的目标:判断某个实例的类型是否等于某个类型,或者说它的子类型).

这是一个如何使用它的示例:

Class<?> c = Number.class;
Object o = Integer.valueOf(5);
System.out.println(c.isInstance(o));

这或多或少相当于:

Object o = Integer.valueOf(5);
System.out.println(o instanceof Number);

除了现在Number部分不再需要在‘编写代码’时写入,您可以提供它,比如说,从一个参数中读取它.当然,您必须动态构造Class实例.您可以通过字符串查找或通过获取实际对象的实际类型来执行此操作.例如:

String input = scanner.next(); // user types in "java.lang.Number"
Class<?> c = Class.forName(input);
Object o = Integer.valueOf(5);
System.out.println(c.isInstance(o));

或者:

Object i = Integer.valueOf(5);
Object d = Double.valueOf(10);
Class<?> c = i.getClass(); // will be java.lang.Integer.class
System.out.println(c.isInstance(d)); // false

但做后一件事真的很危险.通常i.getClass()返回一些隐藏的隐含细节的子类型(Java是分层的和面向对象的,在任何需要ArrayList的地方,有人可以自由地创建一个新的类:class MyVariantOfArrayList extends ArrayList,并使用它-现在你写ArrayList foo = getList(),但foo.getClass()不返回ArrayList-不,你调用那个方法on the object the 104 variable points at,所以它应该是MyVariantOfArrayList.class,而不是ArrayList.class.

Packable本身可能代表一种类型.但是,它要么也需要isInstanceisAssignableFrom之类的东西(您需要开始质疑为什么要在这里重新发明轮子--java.lang.Class已经存在了!),要么它需要一个.getRepresentedClass()方法.您不能将其称为.getClass(),因为JVM已经为所有对象提供了该方法,并且它本身将返回Packable.class.

Java相关问答推荐

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

找到允许的最大底片

Java:根据4象限中添加的行数均匀分布行的公式

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

使用包私有构造函数强制子类Java类

对某一Hyroby控制器禁用@cacheable

调用引发泛型异常的泛型方法时出现编译错误

返回响应时,CamelCase命名约定不起作用

SpringBoot Kafka自动配置-适用于SASL_PLAYTEXT的SSLBundle 包,带SCRAM-SHA-512

GetChildren().emoveAll()不会删除 node

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

Docker不支持弹性APM服务器

无法使用Freemarker从XML中读取重复的标记值

如何以编程方式保存workBench.xmi?

用于Java的Visual Studio代码完成不起作用

如何在Selenium上继续使用最新的WebDriver版本

如何使JOOQ渐变脚本不重新创建表未更改的类?

Cucumber中第二个网页的类对象未初始化

在外部类和内部类之间,当调用外部类内部或外部的主方法时,它们的静态初始化程序的运行顺序不同

具有 DayOfWeek 列表的 JPA 实体