Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时确定列表的内容类型_Java_List_Casting - Fatal编程技术网

Java 如何在运行时确定列表的内容类型

Java 如何在运行时确定列表的内容类型,java,list,casting,Java,List,Casting,我有一个观察者,他期望从一个可观察对象中得到两个可能的对象:List或List,相互排斥。如何区分传递给哪个数据类型 更新(可观测、对象数据)?我无法使用if(列表的数据实例),因为在运行时类型擦除?获取列表中的第一个元素(假设不是空的)并测试检索到的元素的类型。您可以使用instanceof操作符查看对象是否在所需类的类层次结构中,但是如果您想要更精确的测试,请使用getClass().equals(YourClass.class) public void foo(列表){ 如果(!list.

我有一个观察者,他期望从一个可观察对象中得到两个可能的对象:
List
List
,相互排斥。如何区分传递给哪个数据类型
更新(可观测、对象数据)
?我无法使用
if(列表的数据实例)
,因为在运行时类型擦除?

获取
列表中的第一个元素(假设不是空的)并测试检索到的元素的类型。您可以使用
instanceof
操作符查看对象是否在所需类的类层次结构中,但是如果您想要更精确的测试,请使用
getClass().equals(YourClass.class)

public void foo(列表){
如果(!list.isEmpty()){
Object=list.get(0);
//使用instanceof
if(Cat的对象实例){
}
如果(对象实例为橙色){
}
//使用getClass().equals
if(object.getClass().equals(Cat.class)){
}
if(object.getClass().equals(Orange.class)){
}
}
}

我知道这不是PO真正想要的,但我认为这可能会有所帮助。包装机在这种情况下可以提供帮助。您可以创建两个类和一个接口:

interface SpecialList<T> {
  T get(int i);
  void add(T item);
}


class CatList implements SpecialList<Cat> {
  private List<Cat> list;
...
}

class OrangeList implements SpecialList<Orange> {
  private List<Cat> list;
...
}
接口特殊列表{
T得到(inti);
无效添加(T项);
}
类CatList实现SpecialList{
私人名单;
...
}
类OrangeList实现SpecialList{
私人名单;
...
}

然后,Observable可以返回一个SpecialList对象。在这种情况下,
实例将起作用。

您应该检索
列表中的第一个元素
,并使用
instanceof
操作符验证类型。可能是object.getClass()@Mendoza这只会通知您对象是否属于该层次结构,如果它的类型与post的完全相同,那么就不是了。@VinceEmigh这可能足够了。如果您想要一个精确的选项,请使用
object.getClass().equals(Orange.class)
@Duncan-reference。在我看来,除非有必要,否则你不应该防御性地编程。在这种情况下,传递任何
null
值都应该是一个错误,并在此处进行处理。它可能是(或不是)一个缺陷,也可能不取决于设计和软件设计师/架构师的当前经验。+1,但是请注意,如果您打算在列表中存储空值(请参阅为什么这可能不是一个好主意),请注意,
instanceof
将在
null
输入时返回false。只是好奇:比较类是否比检查
instanceof
更准确?@KatedralPillon是的,因为您可以使用
PussyCat extensed Cat
PussyCat PussyCat=new PussyCat()
,则猫的猫实例将返回
true
,但
pusscat.getClass().equals(Cat.class)
将返回
false
interface SpecialList<T> {
  T get(int i);
  void add(T item);
}


class CatList implements SpecialList<Cat> {
  private List<Cat> list;
...
}

class OrangeList implements SpecialList<Orange> {
  private List<Cat> list;
...
}