在这个类中,我在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();
}
}
答案 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();
以上行完全无效。以下是原因:
此处T是泛型类型,因此必须存储在T或其父类中。
final T buffer = new T();
您正在调用类T的构造函数,构造函数永远不能返回数组对象。
如果你想把它变成int [],要么必须是一些工厂方法而不是构造函数。
即使使用了工厂方法,也不能直接使用T,因为T可以是任何东西。您必须定义包含此方法的T的父级。例如,
*
public class LockResourceManager<T extends SomeParentClass> {
//...
}
class SomeParentClass{
//...
//factory method declaration
}
*