类型不匹配错误:无法从播放器转换为线程

时间:2013-07-11 17:05:40

标签: java multithreading

我如何制作一个对象的多个线程?

我有一个带有构造函数Player(String, int, int)的类。 现在,在我的主要内容中,我想创建多个Player对象以用作线程。

我尝试制作这些对象的数组

Thread[] player= new Thread[numberOfPlayers];
    for (int i = 0; i < numberOfPlayers; i++)
    {
       player[i] = new Player("Default", 0, (i + 1));
    }

但是得到'类型不匹配错误:无法从播放器转换为线程'。

我基本上想要在循环中创建这些线程,因为每次程序运行时,都会有随机数量的玩家。线程将需要访问与给予每个字符(String,int,int)的值相对应的信息列表,并一次更新一个。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

除非CharacterThread的子类,否则您无法将Character个对象放入Thread[]。对于所有对象都是如此 - 您不能将一种类型的对象(例如,B)视为另一种类型(例如,B),除非B extends A。< / p>

class A {
    // Empty base class
}

public class B {
    public static void main(String[] args) {
        B b = new B();
        A[] arrayOfAs= new A[1];
        arrayOfAs[0] = b; // Compile-time error! b is not an A object!
    }
}

VS

public class B extends A { // B is now a subclass of A
    public static void main(String[] args) {
        B b = new B();
        A[] arrayOfAs= new A[1];
        arrayOfAs[0] = b; // Works just fine now
    }
}

就个人而言,这听起来并不像你真的需要线程。你知道what the Thread class is for吗?为什么不直接使用你的对象实际的数组呢?还有其他一些事情:我重命名Character,因为那已经是标准库中的一个类了。如果您尝试命名char,您也会收到编译错误,因为该标识符是为char基元类型保留的。

Player[] players = new Player[numberOfPlayers];

答案 1 :(得分:1)

认为你要做的是这样的事情:

创建一组Player类实例。 Player类有一个activate方法可以启动一个循环。那个循环会让玩家移动并做其他事情,然后睡觉,然后无休止地重复。类似的东西:

Player[] parray = new Player[nop];
for (int i = 0; i < nop; i++)  parray[i] = new Player( ... );
for (Player p : parray)  p.activate();

其中激活如下:

public void activate()  {
    new Thread( new Runnable()  {
        public void run()  {
            while (true)  {
                Player.this.x += xshift;
                Player.this.y += yshift;
                // Do other things.
                Thread.sleep( 500 );
            }
        }
    } ).start();
}

注意:此代码绝对不完整。我只想暗示如何做到这一点。

除非你准备好进行很多非常艰难的编程,否则你最好跳过“激活”方法,将run方法直接放在Player中,然后让你的玩家按照这样的循环移动:

while (true)  {
for (Player p : parry)  p.run();
// Do non-player stuff here.
} 

现在你只有一个帖子。更少会出错,当它发生时,你将能够追踪它。 (而且我还在提供一些提示。将无限循环与UI集成在一起并不是一件小事。)

答案 2 :(得分:0)

您不能使用char作为标识符,因为它是保留字。只需将您的数组名称更改为chars我们的内容。

你的Character类也必须扩展Thread才能将它放在一个Thread数组中。

另见http://en.m.wikipedia.org/wiki/List_of_Java_keywords