我在 C# 的泛型中遇到了通配符问题。让我的小示例运行的第一种方法是使用 object 作为泛型类型,因为它是一切的基类。
public class AttributeManager
{
private Dictionary<int, AttributeItem<object>> attributes = new Dictionary<int, AttributeItem<object>>();
public void add(AttributeItem<object> attribute)
{
if (hasAttribute(attribute)) {
return;
}
attributes.Add(attribute.getKey(), attribute);
}
}
public abstract class AttributeItem<T>
{
private int key;
private T attributeValue;
private AttributeManager attributeManager;
public AttributeItem(AttributeManager attributeManager, int key)
{
this.key = key;
this.attributeManager = attributeManager;
attributeManager.add(this); // this line does not work
}
public void setValue(T newValue)
{
attributeValue = newValue;
}
public T getValue()
{
return attributeValue;
}
}
但是,该行:
属性管理器.add(this);
不起作用。它说没有找到这个调用的重载方法。我认为“this”将被转换为 AttributeItem 因为对象必须是 T 的超类。所以我的第一个问题是为什么这个转换不起作用?
我的第二种方法是将 AttributeManager 更改为使用某种通配符:
public class AttributeManager
{
private Dictionary<int, AttributeItem<????>> attributes = new Dictionary<int, AttributeItem<????>>();
/**
* This method will add a new AttributeItem if hasAttribute(AttributeItem) returns false.
*/
public void add<T>(AttributeItem<T> attribute)
{
if (hasAttribute(attribute)) {
return;
}
attributes.Add(attribute.getKey(), attribute); // this line fails
}
}
但正如你所看到的,我不知道我必须在声明中传递什么类型:
Dictionary<int, AttributeItem<????>> attributes
所以我的第二个问题是,我必须使用什么来代替 ???????
问候罗伯特