心法领悟185:Java泛型的局限。
Java泛型使用起来有很多的局限性,如不能使用基本类型作为其类型参数、不能抛出或捕获泛型类型的实例、不能直接使用泛型数组、不能实例化类型变量等。希望读者在使用泛型时多加注意。对于其中的某些不足,可以使用Java的反射机制进行弥补。虽然反射的效率不高,但是也只能忍受了。
package com.mingrisoft.generic; import java.lang.reflect.Array; public class GenericArray<T> { private T[] array; private int size; @SuppressWarnings("unchecked") public GenericArray(Class<T> type, int size) { this.size = size; array = (T[]) Array.newInstance(type, size); } public void put(int index, T item) { if (size > index) { array[index] = item; } } public T get(int index) { if (size > index) { return array[index]; } else { return null; } } }
package com.mingrisoft.generic; public class GenericArrayTest { public static void main(String[] args) { System.out.println("创建String类型的数组并向其添加元素:明日科技"); GenericArray<String> stringArray = new GenericArray<String>(String.class, 10); stringArray.put(0, "明日科技"); System.out.println("String类型的数组元素:" + stringArray.get(0)); System.out.println("创建Integer类型的数组并向其添加元素:123456789"); GenericArray<Integer> integerArray = new GenericArray<Integer>(Integer.class, 10); integerArray.put(0, 123456789); System.out.println("Integer类型的数组元素:" + integerArray.get(0)); } }
运行结果:
创建String类型的数组并向其添加元素:明日科技 String类型的数组元素:明日科技 创建Integer类型的数组并向其添加元素:123456789 Integer类型的数组元素:123456789
补充阅读:
java.lang.Class<T>
Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loader.
The following example uses a Class object to print the class name of an object:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
It is also possible to get the Class object for a named type (or for void) using a class literal. See Section 15.8.2 of The Java™ Language Specification. For example:
System.out.println("The name of class Foo is: "+Foo.class.getName());
Parameters:
<T> the type of the class modeled by this Class object. For example, the type of String.class is Class<String>. Use Class<?> if the class being modeled is unknown.
Since:
JDK1.0
Author:
unascribed
See Also:
java.lang.ClassLoader.defineClass(byte[], int, int)
相关推荐
本实例185重点讲解了如何使用泛型来实现一个自定义的栈结构。下面将详细阐述泛型的概念、泛型栈的实现以及其在实际开发中的应用。 首先,泛型是Java 5引入的新特性,它的主要目的是提高代码的类型安全性,减少类型...
标题“实例183 - 自定义非泛型栈结构”涉及的是编程中的数据结构实现,具体是栈(Stack)这一概念。栈是一种线性数据结构,遵循“后进先出”(Last In First Out, LIFO)的原则。在这个实例中,我们将探讨如何不使用...
- 泛型化的折半查找可以复用同一段代码处理不同类型的数组,如整数、浮点数、自定义对象等。 - 类型安全:编译器会在编译时检查类型,避免了运行时ClassCastException。 - 提高代码可读性:泛型让代码意图更清晰...
"实例188 - 泛型化接口与最大值"这个主题探讨了如何在接口设计中利用泛型来实现通用的最大值计算功能。 首先,我们来理解泛型接口。接口(Interface)在Java中是一种定义行为的蓝图,而泛型接口则是接口与泛型的...
10. **示例代码**:为了便于学习和使用,压缩包中的`ArrayClass.cls`文件可能包含了使用这个自定义数组类的示例代码,展示了如何实例化、填充、操作和清理数组对象。 通过理解和应用这些关键知识点,开发者可以充分...
2. **自定义泛型类**: - 在定义泛型类时,我们可以使用尖括号`<>`来声明一个或多个类型参数,如`class Test<T>`。这里的`T`就是一个类型参数,代表某种未知的类型。在类的实例化过程中,如果没有明确指定类型,...
在C#编程语言中,自定义泛型类是一种强大的工具,它允许我们创建可以处理多种数据类型的类。泛型提供了一种方式,让我们能够在编写代码时推迟对具体数据类型的决定,直到实例化类或者调用方法时。这提高了代码的重用...
编译器会在编译时检查类型一致性,如果尝试向泛型列表或数组中添加不兼容的类型,编译器会抛出错误,从而避免了运行时可能的类型异常。 在实现泛型支持时,我们需要确保所有操作(如添加元素、删除元素、遍历列表)...
泛型数组的排序是常见的编程任务,尤其在处理大量数据时,高效且类型安全的排序至关重要。本文将深入探讨如何在C#中使用泛型和数组排序,并结合面向对象原则,尤其是ASP.NET和.NET框架中的相关概念。 首先,我们...
在C#中,动态声明一个对象数组通常涉及使用new运算符和System.Collections.ArrayList类,或者使用泛型的List类。以下是一个使用ArrayList的例子: ```csharp ArrayList array = new ArrayList(); array.Add(new ...
本压缩包文件“C#源代码-List泛型集合的三个练习”包含了三个练习,旨在帮助学习者深入理解和应用List类。以下是对这些练习知识点的详细说明: 1. **泛型基础** 泛型是C#中的一种强大的特性,它允许创建可重用的...
在C#编程语言中,自定义泛型链表类是一种高效的数据结构,它允许程序员创建一个可以存储不同类型数据的链表,同时保持代码的复用性。本文将深入解析如何在C#中自定义泛型链表类及其使用方法。 首先,让我们分析给出...
总的来说,通过反射创建自定义泛型类是一种灵活的方式,可以让我们在运行时根据需要创建任意类型的实例。然而,由于反射通常涉及更多的性能开销,因此在不必要的情况下应谨慎使用。在处理大量实例或性能关键的代码时...
直接创建泛型数组是非法的,如`T[] array = new T[10];`,但可以通过反射或其他方式间接实现。 9. 类型推断 - 自JDK 7开始,Java引入了类型推断(Type Inference),使得在某些情况下可以省略类型参数,编译器会...
在自定义泛型类中,我们可以定义一个或多个类型参数,这些参数在实例化类或使用泛型方法时会被具体的类型替换。这样做可以确保对象的创建和操作都遵循我们设定的类型规则。 下面是一些关于在Java中使用自定义泛型的...
在Java编程中,泛型是一种强大的工具,它允许我们在编写代码时指定容器(如堆栈、队列等)可以容纳的数据类型,从而...总之,这个 `LinkedStack` 类是一个很好的示例,它展示了Java泛型在实现自定义数据结构时的应用。
3. **数组与指针**:C++中的数组和指针是紧密相关的,实例可能会展示如何声明、初始化和操作数组,以及如何使用指针进行内存管理和数据传递。 4. **结构体与类**:面向对象编程的核心在于类,实例可能包括类的定义...
- 如何定义数组并初始化数组元素。 - **5.3 数组内存模型** - 数组在内存中的存储方式。 - **5.4 数组的遍历** - 使用 for 循环遍历数组的方法。 - **5.5 常见异常** - 数组下标越界异常等常见异常的处理。 - **...
- 不能实例化泛型数组,如`T[] array = new T[10];`是非法的,但可以使用`List<T>`代替。 - 无法在泛型方法中进行实例化,如`T t = new T();`是非法的。 8. **类型推断**: 自JDK 7开始,引入了类型推断,简化了...