专业的JAVA编程教程与资源

网站首页 > java教程 正文

你了解Java泛型吗?

temp10 2024-11-19 11:38:34 java教程 14 ℃ 0 评论

【死记硬背】

泛型提供了编译期强类型检查、无需进行显式类型转换,它的本质是参数化类型,通常用于输入参数、存储类型不确定的场景。比如我们要写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,我们就可以使用 Java 泛型。泛型的具体实现可以定义泛型方法、泛型类、泛型接口等。

你了解Java泛型吗?

关于泛型的知识,还有另外一个概念->类型擦除:英文是type erasure,Java 中的泛型是在编译器这个层次实现的,在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉,这个过程就是类型擦除。

【答案解析】

泛型方法

定义泛型方法时,必须在返回值前边加一个<T>,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值。泛型方法是指在调用的时候可以接收不同类型的参数,根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

public static <T> void sort(T[] a, Comparator<? super T> c) {
  if (c == null) {
    sort(a);
  } else {
    if (LegacyMergeSort.userRequested)
      legacyMergeSort(a, c);
    else
      TimSort.sort(a, 0, a.length, c, null, 0, 0);
  }
}

<? extends T>表示该通配符所代表的类型是 T 类型的子类。<? super T>表示该通配符所代表的类型是 T 类型的父类。

泛型类

在编译器层面上,我们无法知道K和V具体是什么类型,但是在运行时就会根据类型来构造和分配内存。

public class Container<K,V> {
    private K key;
    private V value;
    public Container(K key, V value) {
        this.key = key;
        this.value = value;
    }
    public K getKey() {
        return key;
    }
    public void setKey(K key) {
        this.key = key;
    }
    public V getValue() {
        return value;
    }
    public void setValue(V value) {
        this.value = value;
    }
    public static void main(String[] args) {
        Container<String,String> container = new Container<>("name","面试题解析");
        System.out.println(container.getKey()+":"+container.getValue());
    }
}
// 输出结果
name:面试题解析

泛型接口

// 泛型接口
public interface Generator<T> {
    T name();
}
// 泛型接口实现
public class GeneratorImpl implements Generator<String> {
    @Override
    public String name() {
        return "面试题解析";
    }
}

总结

泛型可以让我们的代码更加具有通用性,不会导致定义了一种类型之后其他的类型都无法使用该代码。

【温馨提示】

点赞+收藏文章,关注我并私信回复【面试题解析】,即可100%免费领取楼主的所有面试题资料!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表