Java锁和条件错误?

时间:2016-03-03 13:27:09

标签: java

在这个类中,我在LockResourceManager类中有方法,它们请求资源并释放资源。但是在课堂上我有一个错误出现在顶部的行

final int[] buffer = new T();

出现的错误是

Type Mismatch: cannot convert from T to int[]

这是代码中出现的唯一错误,所以我不知道如何解决这个问题,因为我不明白该行有什么问题。

public class LockResourceManager<T> extends BasicResourceManager implements ResourceManager {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final int[] buffer = new T();

public LockResourceManager(Resource resource, int maxUses) {
    super(resource, maxUses);
    // TODO Auto-generated constructor stub
}

public void requestResource(int priority) throws ResourceError{
    lock.lock();
    try {
    while (NO_OF_PRIORITIES == buffer.length) notFull.await();
    buffer[NO_OF_PRIORITIES] = priority;
    NO_OF_PRIORITIES = (NO_OF_PRIORITIES+1)%buffer.length;
    NO_OF_PRIORITIES++;
    notEmpty.signal();
    } finally {
    lock.unlock();
    }
}

4 个答案:

答案 0 :(得分:1)

查看你的类声明,我猜T只是一个泛型类型,而不是一个已定义的类;因此你无法做final int[] buffer = new T();

也许您应该使用方法public int[] toBuffer()编写一个类,以便您可以用final int[] buffer = new YourClass().toBuffer();替换错误的行,并且不要更新第一行,如下所示:  public class LockResourceManager<YourClass> extends BasicResourceManager implements ResourceManager

答案 1 :(得分:1)

我不熟悉BasicResourceManager类或ResourceManager接口,但编译错误非常简单:您的buffer变量是int的数组,而值T几乎是你可以想到的任何东西,因为它是一般的(<T>在类声明中)。

通过阅读您的代码,我意识到您只使用它来存储其他int,因此您应将其声明为:final int[] buffer = new int[10];

但请记住,由于它是一个数组,因此它具有固定的大小。您似乎将其用作某种哈希集合,因此您应该使用HashMap<Integer, Integer>,以便它可以根据需要增长。

答案 2 :(得分:0)

T是泛型类型(正如你定义它LockResourceManager<T>)这意味着你不能做new T();(我甚至不理解代码如何编译它)。

您需要执行LockResourceManager<T extends Yourclass>并实例化YourClass

此外,您无法将Object投射到int[],即使它是Integer[ARR_SIZE](但您可以手动进行转换)。

我想你可能想要

private final int[] buffer;

public LockResourceManager(Resource resource, int maxUses) {
   super(resource, maxUses);
   buffer = new int[maxUses];
}

如果您希望您的缓冲区将其大小限制为maxUses

答案 3 :(得分:0)

final int[] buffer = new T();

以上行完全无效。以下是原因:

  1. 此处T是泛型类型,因此必须存储在T或其父类中。

    final T buffer = new T();

  2. 您正在调用类T的构造函数,构造函数永远不能返回数组对象。

  3. 如果你想把它变成int [],要么必须是一些工厂方法而不是构造函数。

  4. 即使使用了工厂方法,也不能直接使用T,因为T可以是任何东西。您必须定义包含此方法的T的父级。例如,

  5. *

    public class LockResourceManager<T extends SomeParentClass> {
    //...
    }
    class SomeParentClass{
    //...
    //factory method declaration
    }
    

    *