Java不允许我们这么做的原因是什么
private T[] elements = new T[initialCapacity];
我可以理解。net不允许我们这样做,因为在。net中,值类型在运行时可以有不同的大小,但在Java中,所有类型的T都将是对象引用,因此具有相同的大小(如果我错了请纠正我)。
原因是什么?
Java不允许我们这么做的原因是什么
private T[] elements = new T[initialCapacity];
我可以理解。net不允许我们这样做,因为在。net中,值类型在运行时可以有不同的大小,但在Java中,所有类型的T都将是对象引用,因此具有相同的大小(如果我错了请纠正我)。
原因是什么?
当前回答
在我的例子中,我只是想要一个堆栈数组,就像这样:
Stack<SomeType>[] stacks = new Stack<SomeType>[2];
由于这是不可能的,我使用了以下作为解决方案:
创建一个非泛型包装器类围绕堆栈(例如MyStack) MyStack[] stacks = new MyStack[2]工作得很好
丑陋,但Java是快乐的。
注意:正如BrainSlugs83在问题的评论中提到的,在.NET中完全可以有泛型数组
其他回答
这是不可能的,因为Java完全在编译器级别上实现了泛型,并且每个类只生成一个类文件。 这叫做类型擦除。
在运行时,已编译的类需要用相同的字节码处理它的所有使用。因此,new T[capacity]将完全不知道需要实例化什么类型。
试试这个:
List<?>[] arrayOfLists = new List<?>[4];
这是因为Java的数组(与泛型不同)在运行时包含关于其组件类型的信息。因此,在创建数组时必须知道组件类型。因为您不知道T在运行时是什么,所以您不能创建数组。
在我看来,如果你不能提供一个像样的解决方案,你只会落得更糟糕的结果。
常见的工作方法如下。
T[] ts = new T[n];
替换为(假设T扩展Object而不是其他类)
T[] ts = (T[]) new Object[n];
我更喜欢第一个例子,然而更多的学院派似乎更喜欢第二个例子,或者干脆不去想它。
关于为什么不能只使用Object[]的大多数例子都适用于List或Collection(它们都是受支持的),所以我认为它们是非常糟糕的参数。
注意:这是Collections库本身不会在没有警告的情况下编译的原因之一。如果在没有警告的情况下不能支持这个用例,那么恕我直言,泛型模型从根本上就有问题了。
在我的例子中,我只是想要一个堆栈数组,就像这样:
Stack<SomeType>[] stacks = new Stack<SomeType>[2];
由于这是不可能的,我使用了以下作为解决方案:
创建一个非泛型包装器类围绕堆栈(例如MyStack) MyStack[] stacks = new MyStack[2]工作得很好
丑陋,但Java是快乐的。
注意:正如BrainSlugs83在问题的评论中提到的,在.NET中完全可以有泛型数组