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();
}
答案 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() );
}