- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
声明之间有什么区别:
GenericClass<T> genericInst = new GenericClass<T>();
和
GenericClass<baseClass> temp = new GenericClass<baseClass>();
这里 GenericClass 定义为 where T : baseClass
GenericClass 包含一个泛型列表
private List<T> vals = new List<T>();
最佳答案
在我看来,如果我错了请纠正我,您将“where T : baseClass”当作 T
类型的默认值。成为baseClass
?
如果是这样,则不是这种情况,特化where T : baseClass
表示类型 T
必须是 baseClass
或源自 baseClass
(如果它是接口(interface)而不是类,则实现)。
因此,如果你有:
public class GenericClass<T> where T : baseClass
{
}
然后你可以说:
var x = new GenericClass<baseClass>();
或者
var y = new GenericClass<SomethignDerivedFromBaseClass>();
但是你不能说:
var z = new GenericClass<int>();
自 int
不继承自 baseClass
.
实际使用T
的唯一方法在上面的实例化中,如果您实际上是从 GenericClass<T>
中调用该行代码:
public GenericClass<T> where T : baseClass
{
void SomeMethod()
{
GenericClass<T> genericInst = new GenericClass<T>();
}
}
或者从另一个已知 T 是 baseClass 的子类的上下文。
更新
根据您的评论,您似乎想知道如果您有:
public class GenericClass<T> where T : baseClass
{
public List<T> Items { get; set; }
...
}
是否可以将从 baseClass 派生的东西添加到列表中,答案是肯定的。类(class)GenericClass<T>
可以为任何 T
声明继承自baseClass。但是 List<T>
仍然会被强类型化为类型 T
.
给出这些:
public class BaseClass { }
public class SubClass : BaseClass { }
A GenericClass<BaseClass>
可以同时容纳 BaseClass
和 SubClass
在里面 List<T>
自 T
将是 BaseClass
.
但是一个GenericClass<SubClass>
会有一个 List<T>
其中 T
将是 SubClass
因此只能容纳 SubClass
的项目或继承自它。
关于c# - 泛型声明和提供类参数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9773993/
我是一名优秀的程序员,十分优秀!