如何解决instanceof无法正常工作?
| 我正在尝试创建一个实现Collection的类,因此它必须具有删除ѭ0的方法,因此我认为我将重复使用已经创建的方法来删除通用类型T
的对象,但是它会引发编译时错误。为什么不行呢?
码
public class ArrayPP<T> implements Collection<T>
{
public boolean remove(Object o)
{
if (o instanceof T)
remove((T)o,true);
else
return false;
return true;
}
}
错误
ArrayPP.java:5: unexpected type
found : T
required: class or array
if (o instanceof T)
为什么,Java?
我已经解决了
if (t.getClass().isinstance(o))
remove((T)o,true);
else
return false;
return true;
但是...我的意思是,如果有人编码“ArrayPP<String> a = new ArrayPP<String>();
”,您知道T
就是String
,对吗?那么,为什么在运行时无法看到o
是String
?我的意思是,如果我要执行a.add(\'c\');
,它将不会编译,因为它知道在这里,ArrayPP
中的add(T item)
方法将只接受String
,所以为什么.........
解决方法
对于删除,您不需要检查类型。如果类型不匹配,它将不存在,并且remove将始终返回false。
如果要动态检查add(T t),则需要将类型存储在字段中。
private final Class<T> tClass;
public boolean add(T t) {
return tClass.isInstanceof(t) && collection.add(t);
}
您是否在“收藏夹”实用程序中查看了“检查的收藏夹”。它可能会做您想要的。
http://download.oracle.com/javase/6/docs/api/java/util/Collections.htmlcheckedCollection、checkedList、checkedSet、checkedMap下
,通用参数类型不能使用“ 15”。那是因为在运行时没有保存有关T的信息。
您应该阅读一些有关泛型的教程/文档。通常在大多数教程中都会解释这种情况。
,T是通用类型参数。泛型类型信息将在运行时删除。因此,您可能无法检查对象是否为T的instanceof。
,由于类型擦除,不能将generic15 types与泛型类型一起使用-运行时没有T
。
由于run1ѭ在运行时不存在,ѭ19should应该怎么做?当o
是null
时instanceof
应该做什么?
一个棘手的解决方法是使用getClass()
并据此做出决定。
快乐的编码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。