簡體   English   中英

Java:為什么我不能調用從myArrayList.get()返回的方法?

[英]Java: Why can't I call methods returned from myArrayList.get()?

for(int i=0;i<this.count();i++)
{
    System.out.println(mediaRegister.get(i).getTitle());
}

this.count簡單地返回的長度mediaRegister mediaRegister是一個包含對象的mediaRegister 所有這些對象都有一個標題字段,應通過object.title或在本例中的object.getTitle()來獲取該字段,該方法只是返回字符串“ title”的方法。

為什么我不能通過mediaRegister.get(i).method()調用對象的方法和字段? 編譯器告訴我“該類型的對象的方法未定義”。

如果需要更多代碼,我會很樂意遵守。

PS:可能與mediaRegister是通用ArrayList的事實有關(即我尚未預先指定它將包含哪種類型)? 對我來說,它們是一個新概念,所以我可能會打破世界上所有的ArrayList禮儀規則。

public MediaReg()
{
    mediaRegister = new ArrayList();
}

PS:可能與mediaRegister是通用ArrayList的事實有關(即我尚未預先指定它將包含哪種類型)?

是的,完全正確。 您應該使用泛型。 您尚未告訴我們您實際上要放入列表中的元素的類型,但是如果它類似於MediaItem ,您將擁有:

// Name of class expanded for readability.
public class MediaRegistry
{
    private final List<MediaItem> items;
    ...

    public MediaRegistry()
    {
        items = new ArrayList<MediaItem>();
    }
}

到那時,編譯器將知道items.get(x)返回類型MediaItem的值,因此您將能夠調用在MediaItem等中聲明的任何方法。

如果這是構造函數中需要做的全部工作,則可以將初始化移到字段聲明中:

public class MediaRegistry
{
    private final List<MediaItem> items = new ArrayList<MediaItem>();
    ...
}

在Java 7中,您可以使用“鑽石語法”使之更加簡潔:

public class MediaRegistry
{
    private final List<MediaItem> items = new ArrayList<>();
    ...
}

有關泛型的更多信息,請參見Java泛型教程

您需要使用泛型-請參閱此處以獲取良好的教程。

在未指定mediaRegister事物類型的情況下,編譯器必須假定它們是最基本的事物,即Object 通過將mediaRegister定義為通用數組列表,您可以告訴編譯器它包含具有某些字段和方法的內容,即通過編寫

ArrayList<MyType> mediaRegister = new ArrayList<MyType>();

由於聲明類型而未定義declaration type 。由於declaration type編譯器無法檢測到返回get(i)declaration type

ArrayList<MediaRegister>  mediaRegister = new ArrayList<MediaRegister>();

在某些情況下,當您無法修改原始集合或應與舊代碼集成時,它僅有助於將獲取的對象顯式轉換為所需的類型:

for(int i=0;i<this.count();i++) {
   System.out.println( ( (MediaRegister)mediaRegister.get(i) ).getTitle() );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM