2016-10-06 9 views
-1

この興味深い問題があります... 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オブジェクトのメソッドはpublicです。

EDIT: プロパティの説明:

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

あなたが明示的にETまたは任意の他のGenericTypeに似たジェネリック型としてそれを使用するのではなく、あなたのPropertyクラスを参照するようにコードをリファクタリングする必要があります。

:あなたがそう

public class PropertyList<T> extends ArrayList<T> 

を使用かのように同じ作り、これらの線に沿って何か - あなたのケースで問題がPropertyGenericTypeに推察され、あなたの具体的なPropertyクラスを参照するのではなく、むしろそれをシャドウイングされていることです

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()メソッドがマークされた行に表示されます。実際にあなたの最初の溶液/試みの中で同じようにシャドーイングするのではなく、あなたのPropertyクラスを拡張し、汎用型Tを使用しています

PropertyList<T extends Property> extends ArrayList<T> 

本当の問題解決

はこれです。

+1

良い答え。後者の場合、ジェネリック 'T'は、' PropertyList extends ArrayList 'のようにプロパティに制限することができ、プロパティのサブタイプでその動作を保持することができます。時にはとても役に立ちます! –

+0

いい加減です:)もう一度感謝しています。 – Shark

+0

これは簡単でした...ありがとう!あなたが実際にそのようなジェネリックで広がることができるかどうかは分かりませんでした – Medardas

関連する問題