如何检查对象是否是 JAVA 中泛型类型的实例?

How do you check if an object is an instance of a generic type in JAVA?

提问人:10969_ shirazu_ 提问时间:12/21/2022 更新时间:12/21/2022 访问量:125

问:

所以我需要编写一个名为 frequency 的方法来计算集合中 E 类型的 Object 的出现次数(我什至不确定该集合是否应该像我一样是一个链表,或者我是否应该只调用构造函数,我只是想如果我不让它成为 LinkedList,那么命名类 LinkedListCollection 有什么意义) , 此方法采用 Object 类型的参数,我无法更改该参数,因为这是合约,这是代码:super()

public class LinkedListCollection<E> extends AbstractCollection<E> {
     
      private int size;
      private Collection<? extends E > list;
     /**
     * @ensures isEmpty();
     */
    public LinkedListCollection() {
      list = new LinkedList<>();
      size = 0;
    }

    /**
 
     *
     * @param is the Collection of elements that should be placed in the list
     *
     * @requires c != null;
     * @requires !c.contains(null);
     * @ensures containsAll(c) && c.containsAll(this);
     * @ensures size() == c.size();
     *
     * @throws NullPointerException is the param collection is null or  contains null
     */
    public LinkedListCollection(Collection<? extends E> c) {
      if ((c == null) || (c.contains(null))  )
     { 
        throw new NullPointerException();
     } 
        list=new LinkedListCollection<>();
        size=c.size();
        list.addAll(c);

    }

然后是我在频率方法中所做的

public int frequency(Object o) {
        E newob= (E) o;
        Iterator it = list.iterator();
        int frequency= 0;
        while(it.hasNext())
       {
         if (it.next().equals(newob))
         frequency++;
       } 
       return frequency;

    } 

现在要计算频率,我想首先检查对象是否是 E 的实例,但 isinstanceof 不适用于泛型类型,所以我只是执行了如您在上面看到的强制转换,我不相信这是正确的做法。此方法的正确编码方法是什么?我的构造函数正确吗?我们如何检查对象是否是泛型类型的实例?(我相信它也需要重新定义) 谢谢!equals

Java 对象 OOP 转换

评论

0赞 Andy Turner 12/21/2022
不管检查某物是否为 的问题,您都在 的构造函数中调用 的构造函数。你不想那样做。ELinkedListCollectionLinkedListCollection
1赞 Andy Turner 12/21/2022
为什么不直接使用?Collections.frequency
0赞 Andy Turner 12/21/2022
为什么你认为有必要检查某物是否是 的实例?如果是 的实例,则可能会在列表中找到它,因此其频率将为 0 或更多;如果不是 的实例,则不会在列表中找到它(除非存在堆污染问题),因此其频率将为 0。EoEoE
0赞 10969_ shirazu_ 12/21/2022
@AndyTurner可以在不扩展 collections 类的情况下在链表上使用 collections.frequency?
0赞 tquadrat 12/21/2022
除了@AndyTurner在他的评论中已经说过的所有内容之外:用等于检查替换该行:,删除演员表,你就设置好了。强制转换只会起作用,当 的实例时,它不会被强制转换。如果实例确实具有相同的类型,则通常的实现总是首先进行测试。if( it.next().equals( o )oEequals()

答: 暂无答案