所以我有这个有趣的问题...... 我想访问从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;
}
}
答案 0 :(得分:2)
您应该重构代码以明确引用您的Property
类,而不是将其用作类似于E
,T
或任何其他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
类,而不是像初始解决方案/尝试那样隐藏它。