在Class类型的List对象上调用方法

时间:2016-01-28 08:26:06

标签: java

我创建了一个包含子类类型的List。为什么我不能调用子类中定义的方法?

    int desktopID = 0;
    Random randomID = new Random();
    List<MessageHandler> test = null;

    for(int i = 0; i < 1000; i++){
        desktopID = randomID.nextInt(10);
        System.out.println(desktopID);
        test.storeMessage("Message Number: "+ i, desktopID);
    }

    System.out.println(test.getRecentMessage(desktopID).toString());

1 个答案:

答案 0 :(得分:0)

一些背景

不清楚你的要求是什么......但它听起来就像你想知道为什么你不能从你的列表MessageHandler调用test中定义的方法1}}类型List<MessageHandler>

javadocList<E>的定义解释了参数E是列表可以包含的类型。例如,add(E e)方法将从此继承,并且只允许将类型为E的项添加到列表中。 not 的含义是,您可以从E对象调用类List<E>中定义的方法。

例如,我不能写这个(.getRGB() is a method from the Color Class):

 List<Color> colorList = new ArrayList<>;
 colorList.getRGB();

但是我可以写这个。请注意我是如何将Color对象添加到列表中并从列表中获取它以调用其上的方法:

 List<Color> colorList = new ArrayList<>;
 colorList.add(Color.Red);

 colorList.get(0).getRGB();

回答您的问题

这对您来说意味着您不应该在列表.storeMessage(...)上呼叫.getRecentMessage(...)test。相反,您应该创建类型为MessageHandler的对象,在其上调用store方法,然后将其添加到列表中。完成后,您可以再次遍历列表,从列表中获取每个对象,然后输出消息。

试试这个:

int desktopID = 0;
Random randomID = new Random();

// Note that I'm instantiating the list before using it!
List<MessageHandler> test = new Arraylist<>;

for(int i = 0; i < 1000; i++){
    desktopID = randomID.nextInt(10);
    System.out.println(desktopID);

    // Create a MessageHandler object and set the message.
    MessageHandler handler = new MessageHandler();
    handler.storeMessage("Message Number: "+ i, desktopID);        

    // Add that method to your list
    test.add(handler);
}

// This is a foreach loop. Very useful! Will iterate over each element in order.
for(MessageHandler handler : test){
    System.out.println(handler.getRecentMessage(desktopID).toString());
}

(我假设你的MessageHandler对象有一个默认的构造函数。)