在Java中,可以声明一个由"未知"泛型类型参数化的变量,如下所示:
Foo> x;
在C#中,这个问号是否有一个等价的结构?
最简洁的答案是不.C#中没有相同的功能.
从Java开发人员的角度来看,来自C#的解决方法Dare Obasanjo:
在某些情况下,可能需要创建一个方法,该方法可以对包含任何类型的数据结构进行操作,而不是包含特定类型的数据结构(例如,打印数据结构中所有对象的方法),同时仍然可以利用在泛型中打字很强.在C#中指定它的机制是通过称为泛型类型推理的特性,而在Java中,这是使用通配符类型完成的.以下代码示例显示了两种方法如何产生相同的结果.
C#代码
using System; using System.Collections; using System.Collections.Generic; class Test{ //Prints the contents of any generic Stack by //using generic type inference public static void PrintStackContents(Stack s){ while(s.Count != 0){ Console.WriteLine(s.Pop()); } } public static void Main(String[] args){ Stack s2 = new Stack (); s2.Push(4); s2.Push(5); s2.Push(6); PrintStackContents(s2); Stack s1 = new Stack (); s1.Push("One"); s1.Push("Two"); s1.Push("Three"); PrintStackContents(s1); } }
Java代码
import java.util.*; class Test{ //Prints the contents of any generic Stack by //specifying wildcard type public static void PrintStackContents(Stack> s){ while(!s.empty()){ System.out.println(s.pop()); } } public static void main(String[] args){ Stacks2 = new Stack (); s2.push(4); s2.push(5); s2.push(6); PrintStackContents(s2); Stack s1 = new Stack (); s1.push("One"); s1.push("Two"); s1.push("Three"); PrintStackContents(s1); } }
AFAIK你不能用C#做到这一点.BCL做了什么,并且有很多例子可以创建一个非泛型的类,然后创建一个继承前一个基本行为的泛型类.见下面的例子.
class Foo { } class Foo: Foo { }
你可以写这样的东西:
Foo t = new Foo();
虽然承认不是干净的方法,但使用Foo
也可能是合适的.