2016-10-06 36 views
-1

所以我有這個有趣的問題... 我想要訪問從列表中檢索的對象的方法,並通過ArrayList進行擴展。ArrayList擴展中的Cast對象沒有看到它的方法

它看起來像這樣:

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; 
} 

} 
+4

不應該'擴展ArrayList '?不管怎麼樣,你不能顯示'Property'的代碼嗎? – Shark

+1

@Shark的確。就目前而言,這是毫無意義的。但是,顯式強制轉換爲'Property'使我想看到定義:) – jensgram

+1

在任何情況下,您的類聲明都不應該如下所示:'public class PropertyList extends ArrayList '您可以輕鬆地對' T'到'Property'? – Shark

回答

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可以是任何東西,並且(我認爲)默認/傳染給對象。

這樣做的第一種方法應該顯示標記行中的getName()方法。

真正解決問題的是這樣的:

PropertyList<T extends Property> extends ArrayList<T> 

實際上採用的是通用型T這反而延長你的初步解決方案/企圖遮蔽它像你Property類。

+1

很好的答案。如果我可以,對於後面的部分,通用'T'可以像Property一樣限制爲Property:'PropertyList 擴展ArrayList '以保留任何Property子類型的行爲。有時候相當有幫助! –

+0

好的補充,再加上:)再次感謝。 – Shark

+0

那很簡單...謝謝!不知道你實際上可以用這樣的泛型擴展 – Medardas