Java泛型类类型:方法、数组与参数化技术解析
立即解锁
发布时间: 2025-08-18 02:26:27 阅读量: 18 订阅数: 32 


Java编程实战:从入门到精通
### Java泛型类类型:方法、数组与参数化技术解析
#### 1. Class<T>类型的常用方法
Class<T>类型提供了一系列实用的方法,以下是一些常见方法及其用途:
| 方法 | 用途 |
| --- | --- |
| `newInstance()` | 调用当前`Class<T>`对象所代表类的默认构造函数,并返回一个类型为`T`的新对象。可能抛出`IllegalAccessException`(类`T`或其无参构造函数不可访问)、`InstantiationException`(`T`为抽象类、接口、数组类型、基本类型或`void`,或者`T`没有无参构造函数)、`ExceptionInInitializerError`(对象初始化失败)、`SecurityException`(没有创建新对象的权限)等异常。 |
| `getSuperclass()` | 返回当前`Class<T>`对象所代表类的超类的`Class`对象。如果代表的是数组类型,返回`Class<Object>`对象;如果代表`Object`类、基本类型或`void`,则返回`null`。 |
| `isInterface()` | 如果当前`Class<T>`对象代表一个接口,则返回`true`。 |
| `getInterfaces()` | 返回一个`Class<?>[]`数组,包含当前`Class`对象对应类或接口所实现的接口的`Class`对象。如果未实现任何接口,数组长度为0。 |
| `toString()` | 返回一个表示当前`Class<T>`对象的`String`对象。 |
这些方法只是`Class<T>`类型方法的一部分,更多关于类内容细节(如字段、公共方法、内部类等)的方法可通过浏览相关API文档获取。
#### 2. 数组与参数化类型
在使用泛型类型时,数组的使用有一些限制。不能创建泛型类型的元素数组,例如以下代码会导致编译错误:
```java
LinkedList<String>[] lists = new LinkedList<>[10]; // Will not compile!!!
```
虽然可以使用类型参数声明泛型类型的字段,但不能使用类型参数创建元素数组。例如:
```java
public class MyType<T> {
// The methods and data members of the type…
private T[] data; // This is OK
}
```
上述代码中定义`data`字段为`T[]`类型是合法的,但在构造函数中创建`T`类型的数组是不允许的:
```java
public class MyType<T> {
// Constructor
public MyType() {
data = new T[10]; // Not allowed!!
}
// The methods and data members of the type…
private T[] data; // This is OK
}
```
不过,可以定义元素类型为无界通配符类型参数结果的泛型类型数组,例如:
```java
LinkedList<?>[] lists = new LinkedList<?>[10]; // OK
```
这个数组的每个元素可以存储任何特定`LinkedList<>`类型的引用,且元素类型可以不同。
#### 3. 通配符数组示例
下面通过一个示例展示如何使用通配符类型的数组:
```java
public class TryWildCardArray {
public static void main(String[] args) {
BinaryTree<?>[] trees = {new BinaryTree<Integer>(), new BinaryTree<String>()};
LinkedList<?>[] lists = new LinkedList<?>[trees.length];
int[] numbers = new int[30];
for(int i = 0 ; i < numbers.length ; ++i) {
numbers[i] = (int)(1000.0*Math.random()); // Random integers 0 to 999
}
// List starting integer values
int count = 0;
System.out.println("Original values are:");
for(int number : numbers) {
System.out.printf("%6d", number);
if(++count%6 == 0) {
System.out.println();
}
}
// Add the integers to first tree
for(int number: numbers) {
((BinaryTree<Integer>)trees[0]).add(number);
}
// Create an array of words to be sorted
String[] words = {"vacillate", "procrastinate", "arboreal", "syzygy",
"xenocracy", "zygote", "mephitic", "soporific",
"grisly", "gristly" };
// List the words
System.out.println("\nOriginal word sequence:");
for(String word : words) {
System.out.printf("%-15s", word);
if(++count%5 == 0) {
System.out.println();
}
}
// Insert the words into second tree
for(String word : words) {
((BinaryTree<String>)trees[1]).add(word);
}
// Sort the values in both trees
for(int i = 0 ; i < lists.length ; ++i){
lists[i] = trees[i].sort();
}
// List the sorted values from both trees
for(LinkedList<?> list : lists){
System.out.println("\nSorted results:");
listAll(list);
}
}
// List the elements in any linked list
public static void listAll(LinkedList<?> list) {
for(Object obj : list) {
System.out.println(obj);
}
}
}
```
**操作步骤**:
1. 创建两个使用通配符类型指定的数组:
- `BinaryTree<?>[] trees = {new BinaryTree<Integer>(), new BinaryTree<String>()};`
- `Lin
0
0
复制全文
相关推荐










