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

this.count只返回 的长度mediaRegistermediaRegister是一个包含对象的数组列表。所有这些对象都有一个标题字段,它应该可以通过 object.title 获取,或者在这种情况下 object.getTitle() 是一个简单地返回字符串“标题”的方法。

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

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

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

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

4 回答 4

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)返回一个 type 的值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 泛型教程。

于 2013-07-06T12:00:02.757 回答
2

您需要使用泛型 - 请参阅此处以获取良好的教程。

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

ArrayList<MyType> mediaRegister = new ArrayList<MyType>();
于 2013-07-06T12:01:40.397 回答
0

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

ArrayList<MediaRegister>  mediaRegister = new ArrayList<MediaRegister>();
于 2013-07-06T12:00:43.003 回答
0

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

for(int i=0;i<this.count();i++) {
   System.out.println( ( (MediaRegister)mediaRegister.get(i) ).getTitle() );
}
于 2013-07-06T12:15:39.860 回答