ArrayList扩展中的Cast对象没有看到它的方法

时间:2016-10-06 13:22:58

标签: java oop arraylist

所以我有这个有趣的问题...... 我想访问从List检索的对象的方法,并由ArrayList扩展。

看起来像这样:

import java.util.ArrayList;
import java.util.Collection;

public class PropertyList<Property> extends ArrayList {

private static final long serialVersionUID = -7854888805136619636L;

    PropertyList(){
        super();
    }

    PropertyList(Collection<Property> c){
        super(c);
    }

    boolean containsProperty(PropertyList<Property> pl){
        Property asdf = (Property) this.get(4);
        System.out.println(asdf.<can't access "Property" methods>);  //mark
        return false;
    }

}

知道为什么我无法访问标记行中的方法吗? 澄清 - Property对象中的方法是公共的。

编辑: 楼盘简介:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;


@XmlAccessorType(XmlAccessType.FIELD)
class Property {

@XmlValue
private String property = null;

@XmlAttribute
String state;
@XmlAttribute
String name;
@XmlAttribute
String type;
@XmlAttribute
String value;

Property(){}

Property(String state, String name, String type, String value){
    this.state = state;
    this.name = name;
    this.type = type;
    this.value = value;
}

public String getName(){
    return name;
}

@Override 
public String toString(){
    return state + " " + name + " " + type + " " + value;
}

}

1 个答案:

答案 0 :(得分:2)

您应该重构代码以明确引用您的Property类,而不是将其用作类似于ET或任何其他GenericType的泛型类型。在您的情况下,问题是Property被推断为GenericType并且没有引用您的具体Property类,而是隐藏它 - 使其与您使用

相同
public class PropertyList<T> extends ArrayList<T>

所以,沿着这些方向:

import java.util.ArrayList;
import java.util.Collection;

public class PropertyList extends ArrayList<Property> {

private static final long serialVersionUID = -7854888805136619636L;

    PropertyList(){
        super();
    }

    PropertyList(Collection<Property> c){
        super(c);
    }

    boolean containsProperty(PropertyList<Property> pl){
        Property asdf = (Property) this.get(4);
        System.out.println(asdf.<can't access "Property" methods>);  //mark
        return false;
    }

}

你知道它的工作“很好”,因为你的IDE会导致你导入Property类。

如果您不想将其仅限于Property课程,请使用

PropertyList<T> extends ArrayList<T>

但是你会得到与现在完全相同的行为 - 这意味着没有方法查找/可用性,因为T可以是任何东西,并且(我认为)默认/被推送到Object。

第一种方式应该在标记的行中显示getName()方法。

真正的问题解决者是:

PropertyList<T extends Property> extends ArrayList<T>

实际上使用泛型类型T扩展了您的Property类,而不是像初始解决方案/尝试那样隐藏它。