package net.liugeng.gencls;
import java.util.Arrays;
public class GenericDynamicArray <T>
{
private T[] arr ;
public static final int INITCAPACITY = 10;
private int count;
public GenericDynamicArray()
{
arr = (T[])new Object[INITCAPACITY];
count = 0;
}
/**
* 取得数组中下标为i的元素的值
* @param i 给定的下标
* @return 数组中下标i所对应的值
*/
public T get(int i)
{
if(i < 0 || i > count)
{
System.out.println("下标不合理");
}
return arr[i];
}
/**
* 取得数组中已经存储的元素的个数
* @return
*/
public int size()
{
return count;
}
/**
* 添加一个新元素
* @param num
*/
public void add(T num)
{
if(arr.length == count)
{
arr = increaseCapacity(arr);
}
arr[count] = num;
count ++;
}
/**
* 移除下标为i的元素
* @param i
*/
public void remove(int i)
{
if(i < 0 || i > count)
{
return ;
}
for(int j = i + 1; j < count; j ++)
{
arr[j-1]= arr[j];
}
count --;
}
/**
* 给数组增容
* @param myArr
* @return
*/
private T[] increaseCapacity(T[] myArr)
{
T[] newArr = (T[])new Object[myArr.length * 2];
for(int i = 0; i < myArr.length; i ++)
{
newArr[i] = myArr[i];
}
return newArr;
}
public void display()
{
for(int i = 0; i < count; i ++)
{
System.out.print(arr[i] + ", ");
}
}
public T[] getArray()
{
return Arrays. <T>copyOf( arr, count );
}
public void displayAll()
{
for(int i = 0; i < arr.length; i ++)
{
System.out.print(arr[i] + ", ");
}
}
}
// 测试
public class Main
{
public static void main(String[] args)
{
GenericDynamicArray <Integer> gda = new GenericDynamicArray <Integer>();
gda.add( new Integer( 1 ) );
gda.add( new Integer( 2 ) );
gda.add( new Integer( 3 ) );
Integer[] arr = gda.getArray(); // 第51行,为什么呢?
for( Integer val : arr )
{
System.out.println( val );
}
}
}
// 出错
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
at net.liugeng.gencls.Main.main(Main.java:51)
分享到:
相关推荐
"实例185 - 自定义泛型化数组类"是一个关于如何创建和使用自定义泛型数组类的示例,这个主题将深入探讨泛型、数组以及两者的结合。 首先,我们需要理解泛型的基本概念。泛型是Java 5引入的一个重要特性,它允许我们...
泛型类型参数`T`代表我们将要存储的元素类型。以下是一个简单的泛型集合类的定义: ```csharp public class MyGenericList { private List<T> list = new List(); public void Add(T item) { list.Add(item); ...
创建自定义泛型集合通常包括以下步骤: 1. **定义泛型类**:在定义集合类时,我们需要在类名后面添加尖括号`<>`,并在其中放置一个或多个类型参数。例如,我们可以创建一个名为`CustomList`的泛型类,如下所示: `...
本篇将详细介绍如何通过反射来创建自定义泛型。 泛型是C#中的一个重要特性,它允许我们在编写类、接口和方法时引入类型参数,从而提高代码的重用性和安全性。自定义泛型类允许我们定义一个通用模板,该模板可以在多...
在C#编程语言中,自定义泛型类是一种强大的工具,它允许我们创建可以处理多种数据类型的类。泛型提供了一种方式,让我们能够在编写代码时推迟对具体数据类型的决定,直到实例化类或者调用方法时。这提高了代码的重用...
本文将深入探讨如何实现自定义全局类型转换器,以提升系统的灵活性和扩展性。 Spring MVC中的类型转换主要由`WebDataBinder`类负责,它使用`Converter`或`Formatter`接口进行转换。`Converter`接口用于基本类型的...
在C#编程语言中,自定义泛型链表类是一种高效的数据结构,它允许程序员创建一个可以存储不同类型数据的链表,同时保持代码的复用性。本文将深入解析如何在C#中自定义泛型链表类及其使用方法。 首先,让我们分析给出...
泛型在.NET中的应用非常广泛,它们既可以用于创建强类型集合,如List和Dictionary,也可以用于创建自定义的泛型类型,如类、结构、接口和委托。 首先,泛型类是在类定义中使用尖括号语法声明的。尖括号内可以包含一...
泛型在Java中主要应用于类、接口和方法,使得程序员可以在编译时检查类型安全,并且可以消除运行时的类型检查和强制转换。 1. **泛型的基本概念** - 类型参数:在类或接口声明中,类型参数(如`K`, `V`)代表一种...
2. 泛型允许在定义类、接口和方法时使用类型参数,以便在编译时进行类型检查,防止在运行时出现ClassCastException。 模拟List泛型: 1. 首先,我们需要创建一个名为`SimList`的类,它将作为我们的泛型列表模拟。 2...
在Java中,自定义泛型主要是指在我们自己编写的类、接口或方法中使用泛型。这个“Java-Custom-Generics:在 Java 中使用自定义泛型的简单示例”很可能是为了展示如何在实际编程中应用泛型。 泛型的引入旨在提高代码...
泛型是一种允许在声明类、接口和方法时使用类型参数的机制。这种参数化类型可以让我们在编写代码时就指定容器存储的数据类型,避免了类型转换的麻烦,同时在编译阶段就能捕获可能出现的类型错误。 2. **自定义数组...
通常,我们可以使用`is`关键字和`IsAssignableFrom`方法来检查非泛型类型的继承和实现关系,但在涉及泛型时,这些方法就不再适用。 对于实例,我们通常使用以下代码来检查: ```csharp if (instance is Foo || ...
自定义泛型类也是泛型的一个重要应用,允许我们为自己的类和接口添加类型参数,以确保它们在操作数据时遵循特定的类型规则。自定义泛型类时,需要在类名后面的尖括号`<>`中声明类型参数,然后在类的方法或成员中使用...
我们还可以创建嵌套的泛型类型,例如`Dictionary, TValue>`,其中`TKey`和`TValue`都是泛型类型参数。 10. **泛型与接口、抽象类的结合**: 泛型类型可以实现接口或继承抽象类。例如,`GenericStack<T>`可以实现`...
`T`是泛型类型,实例化时可以指定具体类型,如`Container<int> intContainer = Container();` 3. **泛型接口**:虽然Dart没有像Java或C#那样明确定义接口的语法,但通过抽象类或带有抽象方法的类,我们可以实现类似...
在.NET编程环境中,List泛型类是常用的集合类型,它提供了丰富的操作方法,包括排序功能。本示例主要探讨如何自定义排序逻辑,使特定元素优先出现在列表前面。这个过程通常涉及委托和比较器,通过定义自定义的比较...
在这个实例中,我们将探讨如何不使用泛型(Generic)来创建一个自定义的栈结构。 描述中提到的博客链接可能提供了具体的代码实现和详细解释,但由于这里没有实际的链接内容,我会基于通用知识来解释自定义栈的创建...
反射是Java的一种强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,甚至可以在运行时动态创建对象和调用方法。在这个自定义的LinkedList中,反射可能被用来在运行时动态地处理不同类型的数据。例如,...