Java:为什么我不能调用myArrayList.get()返回的方法?

时间:2013-07-06 11:57:41

标签: java arraylist

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

this.count只返回mediaRegister的长度。 mediaRegister是一个包含对象的arraylist。所有这些对象都有一个title字段,它应该是object.title可以获取的,或者在这种情况下是object.getTitle(),这是一个简单地返回字符串'title'的方法。

为什么我不能通过mediaRegister.get(i).method()调用对象方法和字段?编译器告诉我'对于Object'类型,方法是未定义的。

如果需要更多代码,我将很乐意遵守。

PS:它可能与mediaRegister是通用ArrayList这一事实有关(即我之前没有指定它将包含哪种类型)?它们对我来说是一个新概念,所以我可能会破坏世界上所有的ArrayList礼仪规则。

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

4 个答案:

答案 0 :(得分:3)

  

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 Generics Tutorial

答案 1 :(得分:2)

您需要使用泛型 - 请参阅here以获得一个好的教程。

如果没有在mediaRegister中指定事物的类型,编译器必须假设它们是最基本的东西,即Object。通过将mediaRegister定义为通用arraylist,您可以告诉编译器它包含某些字段和方法的内容,即通过编写

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

答案 2 :(得分:0)

由于声明类型,类型未定义。由于get(i),编译器无法检测返回declaration type的类型。

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

答案 3 :(得分:0)

在某些情况下,当您无法修改原始集合或者您应该与遗留代码集成时,只需将获取的对象显式转换为所需类型:

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