美文网首页
Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型

Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型

作者: 码而优则仕 | 来源:发表于2020-06-21 18:57 被阅读0次

Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型

在代码进入和离开的边界处,会处理泛型

Java泛型作用:在编译时进行语法检查。

泛形:泛型类,泛型接口,泛型方法

泛型类:

@Data
public class GenericClassExample<T> {

    //由外部指定
    private T member;

    public GenericClassExample(T member){
        this.member = member;
    }

    public T handleSomething(T target){
        return target;
    }
}
public class GenericDemo {

    public static void main(String args[]) {
        GenericClassExample<String> example = new GenericClassExample<>("Hello");
        System.out.println(example.handleSomething("Hi").getClass());
        GenericClassExample<Integer> example1 = new GenericClassExample<>(123);
        System.out.println(example1.handleSomething(11).getClass());
    }
}

执行结果:

class java.lang.String
class java.lang.Integer

如下Java泛型不支持继承,但是可以使用通配符支持泛型继承。

@Data
public class GenericClassExample<T> {

    //由外部指定
    private T member;

    public GenericClassExample(T member){
        this.member = member;
    }

    public T handleSomething(T target){
        return target;
    }
}
public class GenericDemo {

    public static void handlerMember(GenericClassExample<Number> genericClassExample){
        Integer result = 1;
        System.out.println(result+(Integer) genericClassExample.getMember());
    }

    public static void main(String args[]) {
        handlerMember(new GenericClassExample<Number>(12));
        //编译报错
        handlerMember(new GenericClassExample<Integer>(12));
    }
}

但是可以使用通配符支持泛型继承,添加上界,下届;

?通配符和Object有点类似,没有达到编译预检查的效果所以和泛型目的相悖。

所以使用上界和下界实现继承。

使用上界 <? extends Number>—泛型实参的父类是Number

public class GenericDemo {

    public static void handlerMember(GenericClassExample<? extends Number> genericClassExample){
        Integer result = 1;
        System.out.println(result+(Integer) genericClassExample.getMember());
    }

    public static void main(String args[]) {
        //编译未报错
        handlerMember(new GenericClassExample<Integer>(12));
        handlerMember(new GenericClassExample<Number>(12));
    }
}

使用上界 <? super Integer>泛型实参的子类是Integer

public class GenericDemo {

    public static void handlerMember(GenericClassExample<? super Integer> genericClassExample){
        Integer result = 1;
        System.out.println(result+(Integer) genericClassExample.getMember());
    }

    public static void main(String args[]) {
        //编译未报错
        handlerMember(new GenericClassExample<Integer>(12));
        handlerMember(new GenericClassExample<Number>(12));
    }
}

泛型接口:

public interface GenericIFactory<T, N> {
    T nextObject();

    N nextNumber();
}
public class RobotFactory implements GenericIFactory<String, Integer> {

    private String[] ss = new String[]{"Hello", "Hi"};
    private Integer[] dd = new Integer[]{123, 000};

    @Override
    public String nextObject() {
        Random ro = new Random();
        return ss[ro.nextInt(2)];
    }

    @Override
    public Integer nextNumber() {
        Random ro = new Random();
        return dd[ro.nextInt(2)];
    }

    public static void main(String args[]){
        GenericIFactory<String,Integer> genericIFactory = new RobotFactory();
        System.out.println(genericIFactory.nextNumber());;
        System.out.println(genericIFactory.nextObject());;
        }
}

泛型接口实现类

public class GenericFactoryImpl<T,N> implements GenericIFactory<T,N> {
    @Override
    public T nextObject() {
        return null;
    }

    @Override
    public N nextNumber() {
        return null;
    }
}

泛型方法

@Data
public class GenericClassExample<T> {

    //由外部指定
    private T member;

    //构造函数
    public GenericClassExample(T member) {
        this.member = member;
    }

    //类中的普通成员方法
    public T handleSomething(T target) {
        return target;
    }

    //泛型方法
    public static <E> void printArray(E[] array) {
        for (E e : array) {
            System.out.printf("%s", e);
            System.out.printf(" ");
        }
    }
}

E Element 元素,在集合中使用

T Type 在泛型类中使用

K Key

V Value

N Number

R. Result

相关文章

  • Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型

    Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型 在代码进入和离开的边界处,会处理泛型 Java泛型作...

  • 唬人的Java泛型并不难

    泛型 上面的代码有什么区别? 泛型初探 1、为何引入泛型? Java 泛型也是一种语法糖,使用泛型可以在代码编译阶...

  • Kotlin学习之泛型

    Kotlin学习之泛型 Kotlin的泛型与Java一样,都是一种语法糖,只在源代码里出现,编译时会进行简单的字符...

  • Java的泛型类型擦除及类型擦除带来的问题

    1、泛型的类型擦除 Java的泛型是伪泛型,不同于C++的模板机制,这是因为Java的泛型只存在编译期间,在编译完...

  • java泛型

    java的泛型是"伪泛型",为什么这么说。因为泛型只是作用在编译之前,编译之后,泛型都被擦除了(类型擦除)。所以说...

  • 关于泛型擦除

    众所周知,Java 的泛型是假的泛型,是一种编译器提供的语法糖,在jvm 运行时其实是泛型擦除的。一个例子。 以泛...

  • Java 中的泛型

    泛型的目的:Java 泛型就是把一种语法糖,通过泛型使得在编译阶段完成一些类型转换的工作,避免在运行时强制类型转换...

  • 改善 Java 程序的151个建议之泛型和反射

    1.Java泛型是类型擦除的 Java的泛型在编译期有效,在运行期被删除,也就是说所有的泛型参数类型在编译后都会被...

  • Kotlin学习笔记-其他

    一.泛型 在使用java的泛型时候,下面的代码无法通过编译的。因为为了泛型的类型安全,Java 中的泛型类型是 不...

  • 泛型:类型擦除

    Java 语言引入泛型是为了在编译时提供更严格的类型检查,并支持泛型编程。 为了实现泛型,Java编译器将类型擦除...

网友评论

      本文标题:Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型

      本文链接:https://www.haomeiwen.com/subject/cywaxktx.html