Java泛型(泛型类、反射、类型通配符)-黑马视频笔记

2023-10-31

泛型

学习参考视频:B站黑马

本文结构:

一、什么是泛型

二、泛型类、接口

三、泛型方法

四、类型通配符

五、类型擦除

六、泛型和数组

七、 泛型和反射

一、什么是泛型

背景

JAVA推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常。

泛型的概念

参数化类型

好处

  • 编译时检查类型
  • 减少了类型转换

MainClass.java

通过以下程序理解泛型的好处

import java.util.ArrayList;

public class MainClass {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("a");
        list.add(1);

        // 类型转换错误
//        for (Object o : list) {
//            String tmp = (String) o;
//            System.out.println(tmp);
//        }

        ArrayList<String> ll = new ArrayList<>();
        ll.add("Java");
        ll.add("Python");
        ll.add("C++");
//        ll.add(1);    // 编译错误
        for (String s : ll) {
            System.out.println(s);
        }
    }
}

二、泛型类、接口

2.1 泛型类的定义

泛型类的定义

class 类名 <泛型标识,泛型标识> {
  private 泛型标识 变量名;
}

常见的泛型标识:T、E、K、V

使用

  • 语法:类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();
  • java1.7之后,后面的<>内部可省略:类名<具体的数据类型> 对象名 = new 类名<>();

Generic.java

泛型的定义

public class Generic<T> {
    private T key;

    public Generic() {
    }

    public Generic(T key) {
        this.key = key;
    }

    @Override
    public String toString() {
        return "Generic{" +
                "key=" + key +
                '}';
    }

    public void setKey(T key) {
        this.key = key;
    }

    public T getKey() {
        return key;
    }

    public static void main(String[] args) {

        // 不指定类型时,默认Object型
        Generic ge1 = new Generic();
        Object key1 = ge1.getKey();
        System.out.println("key1-->" + key1);

        // 不能是基本数据类型
//        new Generic<int>();

        // 泛型类型实际上都是相同类型
        Generic<String> strGe = new Generic<>("abc");
        Generic<Integer> intGe = new Generic<>(1);
        String strGeKey = strGe.getKey();
        Integer intGeKey = intGe.getKey();
        System.out.println("strKey-->" + strGeKey);
        System.out.println("intGe-->" + intGeKey);
        System.out.println(strGe.getClass() == intGe.getClass());
    }
}

2.2 泛型类的使用

定义一个奖品抽奖的泛型类,getProduct方法获取随机奖品,addProduct向奖品池添加奖品。

import java.util.ArrayList;
import java.util.Random;

public class ProductGetter<T> {

    Random r = new Random();
    // 奖品
    private T product;
    // 奖品池
    ArrayList<T> list = new ArrayList<>();

    public ProductGetter() {
    }

    public ProductGetter(ArrayList<T> list) {
        this.list = list;
    }

    // 抽奖
    public T getProduct() {
        int i = r.nextInt(list.size());
        return list.get(i);
    }

    // 添加奖品
    public void addProduct(T product) {
        list.add(product);
    }

    public static void main(String[] args) {
        // 1. str型
        ProductGetter<String> strProductGetter = new ProductGetter<>();
        // 加入奖池
        String[] strProducts = new String[]{"手枪", "充电器", "弓箭"};
        for (int i = 0; i < strProducts.length; i++) {
            strProductGetter.addProduct(strProducts[i]);
        }
        // 抽奖
        String product = strProductGetter.getProduct();
        System.out.println("恭喜你抽中了" + product);

        // 2. int
        ProductGetter<Integer> intProductGetter = new ProductGetter<>();
        // 加入奖池
        int[] intProducts = new int[]{100000, 20000, 80000};
        for (int i = 0; i < intProducts.length; i++) {
            intProductGetter.addProduct(intProducts[i]);
        }
        // 抽奖
        Integer intProduct = intProductGetter.getProduct();
        System.out.println("恭喜你抽中了" + intProduct);

    }

}

输出:

恭喜你抽中了手枪
恭喜你抽中了100000

2.3 泛型类的派生子类

规则

  • 子类也是泛型类,子类和父类的泛型类型要一致。class ChildGeneric extends Generic

  • 子类不是泛型类,父类要明确泛型的数据类型。class ChildGeneric extends Generic


Parent.java

泛型父类

public class Parent<T> {
    private T value;

    public Parent(T value) {
        this.value = value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

FirstChild.java

子类也是泛型

public class FirstChild<T> extends Parent<T> {

    public FirstChild(T value) {
        super(value);
    }

    public static void main(String[] args) {
        FirstChild<String> firstChild = new FirstChild<>("aaa");
        String value = firstChild.getValue();
        System.out.println("value-->" + value);
    }
}

SecondChild.java

子类不是泛型,需指定父类的泛型类型

public class SecondChild extends Parent<Integer> {

    public SecondChild(Integer value) {
        super(value);
    }

    public static void main(String[] args) {
        SecondChild secondChild = new SecondChild(111);
        Integer value = secondChild.getValue();
        System.out.println("value-->" + value);
    }
}

2.4 泛型接口

规则

  • 实现类不是泛型类,接口要明确数据类型
  • 实现类是泛型类,实现类和接口的泛型类型要一致

Generator.java

/**
 * 泛型接口
 * @param <T>
 */
public interface Generator<T> {
    T getKey();
}

Apple.java

public class Apple implements Generator<String> {

    @Override
    public String getKey() {
        return "hello apple";
    }

    public static void main(String[] args) {
        Apple apple = new Apple();
        System.out.println(apple.getKey());
    }
}

Pair.java

public class Pair<E, T> implements Generator<T> {

    private T key;
    private E value;

    public Pair(E value, T key) {
        this.key = key;
        this.value = value;
    }

    @Override
    public T getKey() {
        return key;
    }

    public E getValue() {
        return value;
    }

    public static void main(String[] args) {
        Pair<String, Integer> pair = new Pair<>("爱马仕", 100);
        Integer key = pair.getKey();
        String value = pair.getValue();
        System.out.println("key-->" + key + ", value-->" + value);
    }
}

三、泛型方法

使用了泛型的类的成员方法不属于泛型方法。声明了的方法才是

语法

修饰符 <T, E, ...> 返回值类型 方法名(形参列表) {
  
}

可变参数在范型表示后面加…,参数为可遍历的对象。

public <E> void print(E... e){
  for(e1: e) {
    System.out.println(e1)
  }
}

ProductGetter.java

import java.util.ArrayList;
import java.util.Random;

public class ProductGetter<T> {

    Random r = new Random();
    // 奖品
    private T product;
    // 奖品池
    ArrayList<T> list = new ArrayList<>();

    public ProductGetter() {
    }

    public ProductGetter(ArrayList<T> list) {
        this.list = list;
    }

    // 抽奖
    public T getProduct() {
        int i = r.nextInt(list.size());
        return list.get(i);
    }

    // 泛型方法。参数传递奖品池,然后从传入的奖品池随机获取奖品
    /**
       *
       * @param list 奖品池
       * @param <E> 奖品的类型
       * @return
       */
    public <E> E getProduct(ArrayList<E> list) {
        int i = r.nextInt(list.size());
        return list.get(i);
    }
  
    /**
       * 定义了静态的泛型方法
       * @param e
       * @param t
       * @param k
       * @param <E>
       * @param <T>
       * @param <K>
       */
    public static <E, T, K> void printType(E e, T t, K k) {
        System.out.println(e + "--" + e.getClass().getSimpleName());
        System.out.println(t + "--" + t.getClass().getSimpleName());
        System.out.println(k + "--" + k.getClass().getSimpleName());
    }

    /**
     * 可变参数的泛型方法
     * @param e
     * @param <E>
     */
    public static <E> void print(E... e) {
        for (E e1 : e) {
            System.out.println(e1 + "--" + e1.getClass().getSimpleName());
        }
    }

    // 添加奖品
    public void addProduct(T product) {
        list.add(product);
    }

}

泛型方法的类型与类的泛型不冲突,名称相同时方法的泛型类型优先级更高。

所以,泛型方法getProduct也可写为:

public <T> T getProduct(ArrayList<T> list) {
    int i = r.nextInt(list.size());
    return list.get(i);
}

MethodTest.java

对泛型方法进行测试

泛型方法可以是静态的,泛型类的成员方法不能是静态的。 可以尝试更改成员方法为static修饰,会出现编译错误。
import java.util.ArrayList;

public class MethodTest {
    public static void main(String[] args) {
        ProductGetter<Integer> productGetter =  new ProductGetter<>();
        // 奖品池
        ArrayList<String> list =  new ArrayList<>();
        list.add("华为电脑");
        list.add("苹果电脑");
        list.add("小米手机");

        String product = productGetter.getProduct(list);
        System.out.println(product + "\t" + product.getClass().getSimpleName());

        System.out.println("<------>");

        // Integer型
        ArrayList<Integer> intList =  new ArrayList<>();
        intList.add(10000);
        intList.add(20000);
        intList.add(40000);

        Integer intProduct = productGetter.getProduct(intList);
        System.out.println(intProduct + "\t" + intProduct.getClass().getSimpleName());

        System.out.println("<------>");

        // 范型参数
        productGetter.printType(111, "aaa", true);

        System.out.println("<------>");

        // 可变参数
        productGetter.print(111, 222, 333);

    }
}

输出:
苹果电脑 String
<------>
20000 Integer
<------>
111–Integer
aaa–String
true–Boolean
<------>
111–Integer
222–Integer
333–Integer

四、类型通配符

4.1 类型通配符

什么是类型通配符

  • ?代替具体的类型实参
  • 所以,类型通配符是类型实参,不是类型形参

Box.java

public class Box <E>{
    private E first;

    public void setFirst(E first) {
        this.first = first;
    }

    public E getFirst() {
        return first;
    }
}

Test.java

测试

public class Test {
    public static void main(String[] args) {
        Box<Integer> box1 = new Box<>();
        box1.setFirst(100);
        showBox(box1);

        Box<String> box2 = new Box<>();
        box2.setFirst("aaa");
        showBox(box2);
    }

//    public static <T> void showBox(Box<T> box) {
//        T first = box.getFirst();
//        System.out.println(first);
//    }

    public static void showBox(Box<?> box) {
        Object first = box.getFirst();
        System.out.println(first);
    }
}

4.2 类型通配符的上限

要求该泛型的类型,必须是实参类型或者其子类

语法

/接口<? extends 实参类型>

Test.java

public class Test {
    public static void main(String[] args) {
        Box<Integer> box1 = new Box<>();
        box1.setFirst(100);
        showBox(box1);

        Box<Number> box2 = new Box<>();
        box2.setFirst(200);
        showBox(box2);
    }

//    public static <T> void showBox(Box<T> box) {
//        T first = box.getFirst();
//        System.out.println(first);
//    }

    public static void showBox(Box<? extends Number> box) {
        Object first = box.getFirst();
        System.out.println(first);
    }
}

案例

三个类,继承关系:Animal<–Cat<–MiniCat

Test01.java

import java.util.ArrayList;

public class Test01 {
    public static void main(String[] args) {
        ArrayList<Animal> animals = new ArrayList<>();
        ArrayList<Cat> cats = new ArrayList<>();
        ArrayList<MiniCat> miniCats = new ArrayList<>();

//        showAnimal(animals);  // 编译错误,因为只能接受Cat及其子类
        showAnimal(cats);
        showAnimal(miniCats);

    }

    public static void showAnimal(ArrayList<? extends Cat> list) {
        // 不确定参数的类型,不能填充元素
//        list.add(new Animal());
//        list.add(new Cat());
//        list.add(new MiniCat());
        for (Cat cat : list) {
            System.out.println(cat.getClass().getSimpleName());
        }
    }

}

4.3 类型通配符的下限

语法

要求该泛型的类型,只能是实参类型,或实参类型的父类类型。

/接口 <? super 实参类型>

TestDown.java

import java.util.ArrayList;
import java.util.List;

public class TestDown {
    public static void main(String[] args) {
        ArrayList<Animal> animals = new ArrayList<>();
        ArrayList<Cat> cats = new ArrayList<>();
        ArrayList<MiniCat> miniCats = new ArrayList<>();

        showAnimal(animals);
        showAnimal(cats);
//        showAnimal(miniCats); // 编译不通过

    }

    /**
     * 类型通配符的下限,要求list只能是Cat或Cat的父类
     * @param list
     */
    public static void showAnimal(List<? super Cat> list) {
        // 编译正确但是不保证正确
//        list.add(new Cat());
//        list.add(new MiniCat());
        for (Object o : list) {
            System.out.println(o);
        }
    }

}

案例

三个实体类

Animal.java

public class Animal {
    public String name;

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                '}';
    }

    public Animal(String name) {
        this.name = name;
    }
}

Cat.java

public class Cat extends Animal{
    public int age;


    public int getAge() {
        return age;
    }

    public Cat(String name, int age) {
        super(name);
        this.age = age;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

MiniCat.java

public class MiniCat extends Cat{
    public int level;


    public MiniCat(String name, int age, int level) {
        super(name, age);
        this.level = level;
    }

    public int getLevel() {
        return level;
    }

    @Override
    public String toString() {
        return "MiniCat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", level=" + level +
                '}';
    }
}

Test02.java

import java.util.Comparator;
import java.util.TreeSet;

public class Test02 {
    public static void main(String[] args) {
        TreeSet<Cat> treeSet = new TreeSet<>(new Comparator2());
//        TreeSet<Cat> treeSet = new TreeSet<>(new Comparator1());
//        TreeSet<Cat> treeSet = new TreeSet<>(new Comparator3());
        treeSet.add(new Cat("jerry", 20));
        treeSet.add(new Cat("amy", 22));
        treeSet.add(new Cat("frank", 35));
        treeSet.add(new Cat("jim", 15));

        //
        for (Cat cat : treeSet) {
            System.out.println(cat);
        }

    }
}

class Comparator1 implements Comparator<Animal> {

    @Override
    public int compare(Animal o1, Animal o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

/**
 * 按年龄升序排列
 */
class Comparator2 implements Comparator<Cat> {

    @Override
    public int compare(Cat o1, Cat o2) {
        return o1.getAge() - o2.getAge();
    }
}

class Comparator3 implements Comparator<MiniCat> {

    @Override
    public int compare(MiniCat o1, MiniCat o2) {
        return o1.getLevel() - o2.getLevel();
    }
}

TreeSet比较器的定义:

此时E为Cat,比较器的泛型必须是Animal或Cat。而比较器Comparator3的泛型类型为MiniCat,第二行注释的代码编译会出现错误。

public TreeSet(Comparator<? super E> comparator)

五、类型擦除

概念

泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是,泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为——类型擦除。

泛型信息只存在编译阶段!!!

5.1 无限制类型擦除

泛型类信息无条件擦除,为Object

在这里插入图片描述

Erasure.java

public class Erasure <T> {
    private T key;

    @Override
    public String toString() {
        return "Erasure{" +
                "key=" + key +
                '}';
    }

    public Erasure() {
    }

    public Erasure(T key) {
        this.key = key;
    }

    public void setKey(T key) {
        this.key = key;
    }

    public T getKey() {
        return key;
    }
}

Test09.java

public class Test09 {

    public static void main(String[] args) {
        // 泛型类型不同,最后会进行类型擦除
        ArrayList<Integer> intList = new ArrayList<>();
        ArrayList<String> strList = new ArrayList<>();

        System.out.println(intList.getClass().getSimpleName());
        System.out.println(strList.getClass().getSimpleName());
        System.out.println(strList.getClass() == intList.getClass());

        // 无限制的擦除为Object
        Erasure<Integer> erasure = new Erasure<>();
        Class<? extends Erasure> cls = erasure.getClass();
        Field[] declaredFields = cls.getDeclaredFields();
        for (Field field : declaredFields) {
            System.out.println(field.getName() + "--" + field.getType().getSimpleName());
        }

    }
}

5.2 有限制的类型擦除

有限制的擦除,擦除为指定类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Muapi8YO-1690871344412)(/Users/xuhanqi/Library/Application Support/typora-user-images/image-20230729164820346.png)]

5.3 擦除方法中类型定义的参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPchbcLX-1690871344413)(/Users/xuhanqi/Library/Application Support/typora-user-images/image-20230729165120324.png)]

Erasure.java

public class Erasure <T extends Number> {
    private T key;

		// 泛型方法,上限为Number
    public <T extends Number> T getValue(T value) {
        return value;
    }

    @Override
    public String toString() {
        return "Erasure{" +
                "key=" + key +
                '}';
    }

    public Erasure() {
    }

    public Erasure(T key) {
        this.key = key;
    }

    public void setKey(T key) {
        this.key = key;
    }

    public T getKey() {
        return key;
    }
}

Test10.java

public class Test10 {
    public static void main(String[] args) {
        Erasure<Integer> er1 = new Erasure<>();
        Erasure<Float> er2 = new Erasure<>();

        Class<? extends Erasure> cls = er1.getClass();
        Method[] declaredMethods = cls.getDeclaredMethods();
        for (Method method : declaredMethods) {
          // 类型擦除为Number
            System.out.println(method.getName() + "--" + method.getReturnType().getSimpleName());
        }
    }
}

输出:

toString–String
getValue–Number
getKey–Number
setKey–void

5.4 桥接方法

在这里插入图片描述

Info.java

/**
 * 泛型接口
 * @param <T>
 */
public interface Info <T> {
    T info(T t);
}

InfoImpl.java

public class InfoImpl implements Info<Integer> {

    @Override
    public Integer info(Integer value) {
        return value;
    }
}

InfoTest.java

import java.lang.reflect.Method;

public class InfoTest {
    public static void main(String[] args) {
        Class<InfoImpl> cls = InfoImpl.class;
        Method[] declaredMethods = cls.getDeclaredMethods();
        for (Method method : declaredMethods) {
            System.out.println(method.getName() + "--" + method.getReturnType().getSimpleName());
        }
    }
}

输出:

info–Integer
info–Object

六、泛型和数组

规则

  • 可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象
  • 可以通过java.lang.reflect.Array的newInstance(Class, int)创建T[]数组

推荐:ArrayList[] arr = new ArrayList();

Test10.java

public class Test10 {
    public static void main(String[] args) {
        // 可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象
//        ArrayList<String>[] listArr = new ArrayList<>[5];   // 编译不通过

        // 先声明引用,不推荐
        ArrayList[] list = new ArrayList[5];
        ArrayList<String>[] listArr = list;

        ArrayList<Integer> intList = new ArrayList<>();
        intList.add(100);

        // 编译通过但是 ClassCastException异常
        list[0] = intList;
        String s = listArr[0].get(0);
        System.out.println(s);
    }
}

Test11.java

import java.util.ArrayList;

public class Test11 {
    public static void main(String[] args) {
        // 莫有问题
        ArrayList<String>[] listArr = new ArrayList[5];

        ArrayList<Integer> intList = new ArrayList<>();
        intList.add(100);

        // 编译不通过
        listArr[0] = intList;
    }
}

案例

Fruit.java

import java.lang.reflect.Array;

public class Fruit <T> {
    // 不知道具体类型,无法new
//    private T[] array = new T[3];
    private T[] array;

    public Fruit(Class<T> cls, int len) {
        // 通过Array.newInstance创建泛型数组
        array = (T[]) Array.newInstance(cls, len);
    }

    // 填充数组
    public void put(T item, int index) {
        array[index] = item;
    }

    // 获取数组元素
    public T get(int index) {
        return array[index];
    }

    // 获取数组
    public T[] getArray() {
        return array;
    }
}

Test12.java

import java.util.Arrays;

public class Test12 {
    public static void main(String[] args) {
        Fruit<String> fruit = new Fruit(String.class, 3);

        fruit.put("apple", 0);
        fruit.put("lemon", 1);
        fruit.put("peach", 2);

        String[] arr = fruit.getArray();
        System.out.println(Arrays.toString(arr));
    }
}

七、 泛型和反射

使用泛型的反射会更加方便

/**
 * 泛型和反射
 */
public class Test {
    public static void main(String[] args) throws Exception{
        // 指定泛型类型
        Class<Person> cls = Person.class;
        Constructor<Person> declaredConstructor = cls.getDeclaredConstructor();
        Person p1 = declaredConstructor.newInstance();

      	// 不指定泛型类型
        Class clz = Person.class;
        Constructor con = clz.getDeclaredConstructor();
        Object p2 = con.newInstance();

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java泛型(泛型类、反射、类型通配符)-黑马视频笔记 的相关文章

随机推荐

  • 基于Levenberg-Marquardt训练算法的BP网络Python实现

    基于Levenberg Marquardt训练算法的BP网络Python实现 分类 统计机器学习算法理论 2013 07 15 23 40 430人阅读 评论 0 收藏 举报 经过一个多月的努力 终于完成了BP网络 参考的资料为 1 Tra
  • http://localhost:8080 请求用户名和密码。信息为: “XDB”

    http localhost 8080 请求用户名和密码 信息为 XDB 安装tomcat后 访问8080端口 被要求输入xdb验证 然后报Unauthorized错误 问题最有效解决办法 问题 我tomcat的jsp环境 可是在访问808
  • ffmpeg合并两路rtmp流并推送

    ffmpeg实现两路流的覆盖 实现两路流的覆盖可以使用ffmpeg的overlay参数 将一路流覆盖到另外一路流之上 overlay参数简介 overlay x y 这里x和y表示距离左上角的坐标偏移 例子 ffmpeg i rtmp ip
  • UniApp原生插件制作

    参考1 UniApp官网 原生插件开发 参考2 uniapp Android 原生插件开发 一 下载安装Android Studio 本部分不在赘述 二 下载UniApp离线SDK 下载地址 Android 离线SDK 正式版 uni小程序
  • linux 基础 --进程管理 ps

    查看进程 静态 ps 观察进程 ps aux head 5 静态查看进程ps USER PID CPU MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0 0 0 6 127948 6520 S
  • STM32低功耗停止模式 以及简述判断中断的两种方式

    include wkup h include led h include delay h 本程序只供学习使用 未经作者许可 不得用于其它任何用途 ALIENTEK战舰STM32开发板 待机唤醒 代码 正点原子 ALIENTEK 技术论坛 w
  • 【Python】欧氏距离和余弦距离

    一 欧几里得距离 Euclidean Distance 欧氏距离是最常见的距离度量 衡量的是多维空间中各个点之间的绝对距离 公式如下 因为计算是基于各维度特征的绝对数值 所以欧氏度量需要保证各维度指标在相同的刻度级别 比如对身高 cm 和体
  • 安卓视频播放器——ijkPlayer(Bilibili开源)

    作为一个B站 Bilibili 用户 特别喜欢B站的播放器 凑巧 发现了b站的github的地址 嘿嘿 B站github地址f 发现了ijkplayer播放器 支持android 和ios 我们用AndroidStudio新建project
  • 马上:硬件开关机

    马上 硬件开关机 通过多年与RK3288不同产品的方案公司的接触 梳理并总结RK3288方案常用开关机的方案 PMU RTC 方案 PMU RK808 RTC hym8563 纽扣电池供电 硬件上需要把RTC的中断脚接到RK808的开机引脚
  • Feign负载均衡写法

    Feign主要为了面向接口编程 feign是web service客户端 是接口实现的 而ribbon是通过微服务名字访问通过RestTemplate调用的 如下 在Feign的实现下 我们只需要创建一个接口并使用注解的方式来配置它 类似于
  • 新的分享之路开启,感谢您的陪伴

    分享之初 新学期即将到来之时 我开启了新的分享之路 第一次尝试在微信公众号上分享原创知识 起初 我一直是拒绝的 因为读博异常忙碌 哪有时间去经营一个新的学习天地 并且经过十年的CDSN分享 慢慢养成了力争每一篇文章都是干货 都对得起读者的喜
  • 在Android Studio中添加com.android.support:design的支持

    关于Material Design Google在2015的IO大会上 给我们带来了Material Design的设计规范 同时 也给我们带来了全新的Android Design Support Library 利用这个库在Android
  • window系统默认编码格式GBK怎么理解

    window系统默认编码格式GBK怎么理解 对我们在window 平台编码有什么影响呢 在说明这个问题之前 我们先搞清楚 文件编码格式 编程语言中字节数组转字符串默认使用的编码格式 操作系统默认的编码格式 1 文件编码格式 指的是我们编写的
  • 递归问题

    1 题目分析 1 问题描述 一个人赶着鸭子去每个村庄卖 每经过一个村子卖去所赶鸭子的一半又一只 这样他经过了七个村子后还剩两只鸭子 问他出发时共赶多少只鸭子 经过每个村子卖出多少只鸭子 分析 卖家在经过七个村子后剩下2只鸭子 令duck 2
  • C语言,一维数组实验五

    A C语言实验 最值 描述 有一个长度为n的整数序列 其中最大值和最小值不会出现在序列的第一和最后一个位置 请写一个程序 把序列中的最小值与第一个数交换 最大值与最后一个数交换 输出转换好的序列 输入 输入包括两行 第一行为正整数n 1 n
  • 7-14 求整数段和 (15分)

    7 14 求整数段和 15分 给定两个整数A和B 输出从A到B的所有整数以及这些数的和 输入格式 输入在一行中给出2个整数A和B 其中 100 A B 100 其间以空格分隔 输出格式 首先顺序输出从A到B的所有整数 每5个数字占一行 每个
  • 【03】pytorch 自定义transform操作-踩坑记录

    1 椒盐噪声是什么 就是图片上出现的黑白点 类似于老式电视机出现雪花屏幕的感觉 transforms是pytorch定义的一个类 对图像进行各种变换 进行图像变换的目的是数据增强 使得模型的鲁棒性更加的强 尽管pytorch已经提供了很多的
  • 用numpy里边的random函数生成随机数据&&&同时进行画图练习

    import numpy as np import matplotlib pyplot as plt import sklearn from sklearn linear model import LinearRegression from
  • python 散点图 不同颜色_Python中的散点图和颜色映射

    这是一个例子 import numpy as np import matplotlib pyplot as plt x np random rand 100 y np random rand 100 t np arange 100 plt
  • Java泛型(泛型类、反射、类型通配符)-黑马视频笔记

    泛型 学习参考视频 B站黑马 本文结构 一 什么是泛型 二 泛型类 接口 三 泛型方法 四 类型通配符 五 类型擦除 六 泛型和数组 七 泛型和反射 一 什么是泛型 背景 JAVA推出泛型以前 程序员可以构建一个元素类型为Object的集合