最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你搞懂Java中泛型符號(hào)T,E,K,V,?的區(qū)別

 更新時(shí)間:2025年10月24日 10:24:17   作者:蘇三說技術(shù)  
泛型是Java中一個(gè)非常重要的內(nèi)容,這篇文章主要介紹了Java泛型中T、E、K、V、?的符號(hào)含義與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

今天想和大家聊聊Java泛型中那些讓人眼花繚亂的符號(hào)——T、E、K、V、?。

有些小伙伴在工作中,可能經(jīng)常遇到這樣的場(chǎng)景:閱讀框架源碼時(shí)被各種泛型符號(hào)繞暈,寫業(yè)務(wù)代碼時(shí)不確定該用哪個(gè)符號(hào),或者面試時(shí)被問到泛型通配符的區(qū)別一頭霧水。

其實(shí),這些符號(hào)并沒有那么神秘,只要理解了它們的設(shè)計(jì)初衷和使用場(chǎng)景,就能輕松掌握。

今天,我就從淺入深,帶你徹底搞懂Java泛型的這些符號(hào),希望對(duì)你會(huì)有所幫助。

為什么需要泛型符號(hào)?

在深入具體符號(hào)之前,我們先聊聊為什么Java要引入泛型,以及為什么需要這些符號(hào)。

泛型的前世今生

在Java 5之前,集合類只能存儲(chǔ)Object類型,這導(dǎo)致兩個(gè)問題:

  • 類型不安全:任何對(duì)象都能放進(jìn)集合,取出時(shí)需要強(qiáng)制類型轉(zhuǎn)換
  • 運(yùn)行時(shí)異常:類型轉(zhuǎn)換錯(cuò)誤只能在運(yùn)行時(shí)發(fā)現(xiàn)
// Java 5之前的寫法 - 容易出錯(cuò)
List list = new ArrayList();
list.add("hello");
list.add(123); // 編譯通過,但邏輯錯(cuò)誤

String str = (String) list.get(1); // 運(yùn)行時(shí)ClassCastException!

泛型的引入解決了這些問題,讓類型錯(cuò)誤在編譯期就能被發(fā)現(xiàn)。

符號(hào)的作用

泛型符號(hào)本質(zhì)上是一種類型參數(shù),它們讓代碼:

  • 更安全:編譯期類型檢查
  • 更清晰:代碼自文檔化
  • 更靈活:支持代碼復(fù)用

有些小伙伴在工作中可能覺得這些符號(hào)很抽象,其實(shí)它們就像數(shù)學(xué)中的變量x、y、z一樣,是占位符而已。

接下來,讓我們逐個(gè)揭開它們的神秘面紗。

符號(hào)T:最通用的類型參數(shù)

T是Type的縮寫,這是最常用、最通用的泛型符號(hào)。當(dāng)你不確定用什么符號(hào)時(shí),用T通常不會(huì)錯(cuò)。

為什么需要T?

T代表"某種類型",它讓類、接口、方法能夠處理多種數(shù)據(jù)類型,同時(shí)保持類型安全。

示例代碼

// 1. 泛型類 - 包裝器
public class Box<T> {
    private T value;
    
    public Box(T value) {
        this.value = value;
    }
    
    public T getValue() {
        return value;
    }
    
    public void setValue(T value) {
        this.value = value;
    }
    
    // 2. 泛型方法
    public <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }
}

// 使用示例
public class TExample {
    public static void main(String[] args) {
        // 字符串類型的Box
        Box<String> stringBox = new Box<>("Hello");
        String value1 = stringBox.getValue(); // 不需要強(qiáng)制轉(zhuǎn)換
        
        // 整數(shù)類型的Box  
        Box<Integer> intBox = new Box<>(123);
        Integer value2 = intBox.getValue(); // 類型安全
        
        // 泛型方法使用
        stringBox.printArray(new String[]{"A", "B", "C"});
        intBox.printArray(new Integer[]{1, 2, 3});
    }
}

深度剖析

有些小伙伴在工作中可能會(huì)困惑:類上的<T>和方法上的<T>是同一個(gè)T嗎?

答案是不一定

它們屬于不同的作用域:

public class ScopeExample<T> {          // 類級(jí)別T
    private T field;                    // 使用類級(jí)別T
    
    public <T> void method(T param) {   // 方法級(jí)別T - 隱藏類級(jí)別T!
        System.out.println("類T: " + field.getClass());
        System.out.println("方法T: " + param.getClass());
    }
}

// 測(cè)試
ScopeExample<String> example = new ScopeExample<>();
example.method(123); 
// 輸出:
// 類T: class java.lang.String
// 方法T: class java.lang.Integer

為了避免混淆,建議使用不同的符號(hào):

public class ClearScopeExample<T> {          // 類級(jí)別T
    public <U> void method(U param) {        // 方法級(jí)別U
        // 清晰區(qū)分
    }
}

為了更直觀理解泛型類的工作原理,我畫了一個(gè)類圖:

泛型類的好處:

使用場(chǎng)景

  • 通用的工具類、包裝類
  • 不確定具體類型但需要類型安全的場(chǎng)景
  • 框架基礎(chǔ)組件

符號(hào)E:集合元素的專屬代表

E是Element的縮寫,主要用于集合框架中表示元素類型。

雖然功能上E和T沒有區(qū)別,但使用E能讓代碼意圖更清晰。

為什么需要E?

在集合上下文中,E明確表示"元素類型",讓代碼更易讀,符合最小驚訝原則。

示例代碼

// 自定義集合接口
public interface MyCollection<E> {
    boolean add(E element);
    boolean remove(E element);
    boolean contains(E element);
    Iterator<E> iterator();
}

// 自定義ArrayList實(shí)現(xiàn)
public class MyArrayList<E> implements MyCollection<E> {
    private Object[] elements;
    private int size;
    
    public MyArrayList() {
        this.elements = new Object[10];
        this.size = 0;
    }
    
    @Override
    public boolean add(E element) {
        if (size >= elements.length) {
            // 擴(kuò)容邏輯
            Object[] newElements = new Object[elements.length * 2];
            System.arraycopy(elements, 0, newElements, 0, elements.length);
            elements = newElements;
        }
        elements[size++] = element;
        return true;
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        return (E) elements[index]; // 注意:這里需要強(qiáng)制轉(zhuǎn)換
    }
    
    // 其他方法實(shí)現(xiàn)...
}

// 使用示例
public class EExample {
    public static void main(String[] args) {
        MyCollection<String> stringList = new MyArrayList<>();
        stringList.add("Java");
        stringList.add("泛型");
        
        // 編譯期類型檢查
        // stringList.add(123); // 編譯錯(cuò)誤!
        
        MyCollection<Integer> intList = new MyArrayList<>();
        intList.add(1);
        intList.add(2);
    }
}

深度剖析

有些小伙伴在工作中可能會(huì)問:為什么Java集合框架選擇E而不是T?

這背后體現(xiàn)了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的思想:

  • List<E>:E明確表示列表中的元素
  • Set<E>:E明確表示集合中的元素
  • Collection<E>:E明確表示集合元素

這種命名讓API更加自文檔化。看到List<String>,我們立即知道這是字符串列表;而如果寫成List<T>,含義就不那么清晰了。

類型擦除的真相
雖然我們?cè)诖a中寫了MyArrayList<String>,但在運(yùn)行時(shí),JVM看到的是MyArrayList(原始類型)。

泛型信息被擦除了,這就是為什么在get方法中需要強(qiáng)制轉(zhuǎn)換的原因。

為了理解集合框架中E的使用,我畫了一個(gè)繼承關(guān)系圖:

使用場(chǎng)景

  • 自定義集合類
  • 處理元素類型的工具方法
  • 任何需要明確表示"元素"的場(chǎng)景

符號(hào)K和V:鍵值對(duì)的黃金搭檔

K和V分別代表Key和Value,是專門為Map等鍵值對(duì)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的。

它們總是成對(duì)出現(xiàn)。

為什么需要K和V?

在Map上下文中,明確區(qū)分鍵類型和值類型非常重要,K和V讓這種區(qū)分一目了然。

示例代碼

// 自定義Map接口
public interface MyMap<K, V> {
    V put(K key, V value);
    V get(K key);
    boolean containsKey(K key);
    Set<K> keySet();
    Collection<V> values();
    Set<Entry<K, V>> entrySet();
    
    interface Entry<K, V> {
        K getKey();
        V getValue();
        V setValue(V value);
    }
}

// 自定義HashMap實(shí)現(xiàn)
public class MyHashMap<K, V> implements MyMap<K, V> {
    private static final int DEFAULT_CAPACITY = 16;
    private Node<K, V>[] table;
    private int size;
    
    // 鏈表節(jié)點(diǎn)
    static class Node<K, V> implements MyMap.Entry<K, V> {
        final K key;
        V value;
        Node<K, V> next;
        
        Node(K key, V value, Node<K, V> next) {
            this.key = key;
            this.value = value;
            this.next = next;
        }
        
        @Override
        public K getKey() {
            return key;
        }
        
        @Override
        public V getValue() {
            return value;
        }
        
        @Override
        public V setValue(V newValue) {
            V oldValue = value;
            value = newValue;
            return oldValue;
        }
    }
    
    public MyHashMap() {
        table = new Node[DEFAULT_CAPACITY];
        size = 0;
    }
    
    @Override
    public V put(K key, V value) {
        int index = hash(key) & (table.length - 1);
        Node<K, V> head = table[index];
        
        // 檢查是否已存在相同key
        for (Node<K, V> node = head; node != null; node = node.next) {
            if (key.equals(node.key)) {
                V oldValue = node.value;
                node.value = value;
                return oldValue;
            }
        }
        
        // 新節(jié)點(diǎn)插入鏈表頭部
        table[index] = new Node<>(key, value, head);
        size++;
        return null;
    }
    
    @Override
    public V get(K key) {
        int index = hash(key) & (table.length - 1);
        for (Node<K, V> node = table[index]; node != null; node = node.next) {
            if (key.equals(node.key)) {
                return node.value;
            }
        }
        return null;
    }
    
    private int hash(K key) {
        return key == null ? 0 : key.hashCode();
    }
    
    // 其他方法實(shí)現(xiàn)...
}

// 使用示例
public class KVExample {
    public static void main(String[] args) {
        MyMap<String, Integer> ageMap = new MyHashMap<>();
        ageMap.put("張三", 25);
        ageMap.put("李四", 30);
        
        // 類型安全
        Integer age = ageMap.get("張三"); // 不需要強(qiáng)制轉(zhuǎn)換
        // ageMap.put(123, "test"); // 編譯錯(cuò)誤!
        
        // 遍歷示例
        for (String name : ageMap.keySet()) {
            Integer personAge = ageMap.get(name);
            System.out.println(name + ": " + personAge);
        }
    }
}

深度剖析

有些小伙伴在工作中可能會(huì)發(fā)現(xiàn),K和V不僅用于Map,還廣泛用于各種鍵值對(duì)場(chǎng)景:

// 元組(Tuple) - 包含兩個(gè)不同類型的對(duì)象
public class Pair<K, V> {
    private final K key;
    private final V value;
    
    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }
    
    public K getKey() { return key; }
    public V getValue() { return value; }
}

// 使用
Pair<String, Integer> nameAge = new Pair<>("王五", 28);
String name = nameAge.getKey();
Integer age = nameAge.getValue();

K的約束

在大多數(shù)情況下,K應(yīng)該是不變的對(duì)象(或者有正確的hashCode和equals實(shí)現(xiàn)),因?yàn)镸ap依賴這些方法來定位值。

為了理解Map中K和V的關(guān)系,我畫了一個(gè)存儲(chǔ)結(jié)構(gòu)圖:

使用場(chǎng)景

  • Map及其相關(guān)實(shí)現(xiàn)
  • 鍵值對(duì)數(shù)據(jù)結(jié)構(gòu)
  • 需要返回多個(gè)相關(guān)值的場(chǎng)景
  • 緩存實(shí)現(xiàn)

符號(hào)?:通配符的魔法

?是泛型中最靈活也最容易讓人困惑的符號(hào),它代表"未知類型"。

為什么需要??

有些時(shí)候,我們不需要知道具體類型,只需要表達(dá)"某種類型"的概念,這時(shí)候?就派上用場(chǎng)了。

示例代碼

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

public class WildcardExample {
    
    // 1. 無界通配符 - 接受任何類型的List
    public static void printList(List<?> list) {
        for (Object element : list) {
            System.out.println(element);
        }
    }
    
    // 2. 上界通配符 - 只接受Number及其子類的List
    public static double sumOfList(List<? extends Number> list) {
        double sum = 0.0;
        for (Number number : list) {
            sum += number.doubleValue();
        }
        return sum;
    }
    
    // 3. 下界通配符 - 只接受Integer及其父類的List
    public static void addNumbers(List<? super Integer> list) {
        for (int i = 1; i <= 5; i++) {
            list.add(i); // 可以添加Integer,因?yàn)镮nteger是?的子類
        }
    }
    
    // 4. 通配符在類定義中的使用
    public static class BoxHandler {
        // 只能從box中讀取,不能寫入
        public static void readFromBox(Box<?> box) {
            Object value = box.getValue();
            System.out.println("Read: " + value);
        }
        
        // 只能向box中寫入,不能讀取(除了Object)
        public static void writeToBox(Box<? super String> box, String value) {
            box.setValue(value);
        }
    }
    
    public static void main(String[] args) {
        // 無界通配符使用
        List<String> stringList = List.of("A", "B", "C");
        List<Integer> intList = List.of(1, 2, 3);
        printList(stringList); // 可以接受
        printList(intList);    // 也可以接受
        
        // 上界通配符使用
        List<Integer> integers = List.of(1, 2, 3);
        List<Double> doubles = List.of(1.1, 2.2, 3.3);
        System.out.println("Int sum: " + sumOfList(integers)); // 6.0
        System.out.println("Double sum: " + sumOfList(doubles)); // 6.6
        
        // 下界通配符使用
        List<Number> numberList = new ArrayList<>();
        addNumbers(numberList); // 可以添加Integer到Number列表
        System.out.println("Number list: " + numberList);
        
        List<Object> objectList = new ArrayList<>();
        addNumbers(objectList); // 也可以添加到Object列表
        System.out.println("Object list: " + objectList);
    }
}

深度剖析

有些小伙伴在工作中經(jīng)?;煜?code>? extends和? super,其實(shí)記住PECS原則就很簡(jiǎn)單:

PECS(Producer Extends, Consumer Super)

  • 當(dāng)你是生產(chǎn)者(主要從集合讀取)時(shí),使用? extends
  • 當(dāng)你是消費(fèi)者(主要向集合寫入)時(shí),使用? super
// 生產(chǎn)者 - 從src讀取數(shù)據(jù)
public static <T> void copy(List<? extends T> src, List<? super T> dest) {
    for (T element : src) {
        dest.add(element); // src生產(chǎn),dest消費(fèi)
    }
}

// 使用
List<Integer> integers = List.of(1, 2, 3);
List<Number> numbers = new ArrayList<>();
copy(integers, numbers); // 正確:Integer extends Number, Number super Integer

為了理解通配符的邊界概念,我畫了一個(gè)類型層次圖:

使用場(chǎng)景

  • 編寫通用工具方法
  • 處理未知類型的集合
  • 實(shí)現(xiàn)靈活的API接口
  • 框架設(shè)計(jì)中的類型抽象

高級(jí)話題:泛型約束和最佳實(shí)踐

了解了基本符號(hào)后,我們來看看一些高級(jí)用法和最佳實(shí)踐。

泛型約束

// 1. 多邊界約束
public class MultiBound<T extends Number & Comparable<T> & Serializable> {
    private T value;
    
    public boolean isGreaterThan(T other) {
        return value.compareTo(other) > 0;
    }
}

// 2. 靜態(tài)方法中的泛型
public class Utility {
    // 靜態(tài)方法需要聲明自己的泛型參數(shù)
    public static <T> T getFirst(List<T> list) {
        return list.isEmpty() ? null : list.get(0);
    }
    
    // 不能在靜態(tài)上下文中使用類的泛型參數(shù)
    // public static T staticMethod() { } // 編譯錯(cuò)誤!
}

// 3. 泛型與反射
public class ReflectionExample {
    public static <T> T createInstance(Class<T> clazz) {
        try {
            return clazz.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException("創(chuàng)建實(shí)例失敗", e);
        }
    }
}

最佳實(shí)踐

1.命名約定

  • T:通用類型
  • E:集合元素
  • K:鍵
  • V:值
  • N:數(shù)字
  • S、U、V:第二、第三、第四類型參數(shù)

2.避免過度使用

   // 不好:過度泛型化
   public class OverGeneric<A, B, C, D> {
       public <E, F> E process(A a, B b, C c, D d, E e, F f) {
           // 難以理解和維護(hù)
           return e;
       }
   }
   
   // 好:適度使用
   public class UserService {
       public <T> T findUserById(String id, Class<T> type) {
           // 清晰的意圖
       }
   }

3.處理類型擦除

   // 由于類型擦除,不能直接使用T.class
   public class TypeErasureExample<T> {
       // private Class<T> clazz = T.class; // 編譯錯(cuò)誤!
       
       // 解決方案:傳遞Class對(duì)象
       private Class<T> clazz;
       
       public TypeErasureExample(Class<T> clazz) {
           this.clazz = clazz;
       }
       
       public T createInstance() throws Exception {
           return clazz.getDeclaredConstructor().newInstance();
       }
   }

總結(jié)

經(jīng)過以上介紹,相信你對(duì)Java泛型符號(hào)有了更深入的理解。

符號(hào)對(duì)比

符號(hào)含義使用場(chǎng)景示例
T通用類型工具類、不確定類型Box<T>, Converter<T>
E元素類型集合框架List<E>, Set<E>
K鍵類型鍵值對(duì)數(shù)據(jù)結(jié)構(gòu)Map<K, V>, Cache<K, V>
V值類型鍵值對(duì)數(shù)據(jù)結(jié)構(gòu)Map<K, V>, Entry<K, V>
?未知類型靈活的方法參數(shù)List<?>, <? extends T>

選擇原則

語義優(yōu)先

  • 集合元素用E
  • 鍵值對(duì)用K、V
  • 通用類型用T
  • 未知類型用?

PECS原則

  • 生產(chǎn)者用? extends
  • 消費(fèi)者用? super

可讀性優(yōu)先

  • 避免過度泛型化
  • 使用有意義的符號(hào)名
  • 適當(dāng)添加文檔注釋

我的一些建議

有些小伙伴在工作中,可能一開始覺得泛型很復(fù)雜,但只要掌握了核心概念,就能寫出更安全、更靈活的代碼。記住這些要點(diǎn):

  • 類型安全是第一要?jiǎng)?wù):讓錯(cuò)誤在編譯期暴露
  • 代碼即文檔:好的泛型使用能讓代碼自說明
  • 平衡靈活性和復(fù)雜度:不要為了泛型而泛型
  • 理解類型擦除:知道泛型在運(yùn)行時(shí)的行為

泛型是Java類型系統(tǒng)的重要組成,熟練掌握這些符號(hào),能讓你在框架設(shè)計(jì)、工具開發(fā)、代碼重構(gòu)中游刃有余。

以上就是一文帶你搞懂Java中泛型符號(hào)T,E,K,V,?的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Java泛型符號(hào)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IntelliJ IDEA 常用設(shè)置(配置)吐血整理(首次安裝必需)

    IntelliJ IDEA 常用設(shè)置(配置)吐血整理(首次安裝必需)

    這篇文章主要介紹了IntelliJ IDEA 常用設(shè)置(配置)吐血整理(首次安裝必需),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Spring?Boot?3.3?實(shí)現(xiàn)職責(zé)鏈模式輕松應(yīng)對(duì)電商訂單流程分析

    Spring?Boot?3.3?實(shí)現(xiàn)職責(zé)鏈模式輕松應(yīng)對(duì)電商訂單流程分析

    在電商系統(tǒng)中,訂單處理流程包括庫存校驗(yàn)、優(yōu)惠券驗(yàn)證、運(yùn)費(fèi)計(jì)算等多個(gè)步驟,這些步驟具有順序依賴性,為了管理這些業(yè)務(wù)邏輯,職責(zé)鏈模式提供了解決方案,通過鏈?zhǔn)疥P(guān)系將處理邏輯模塊化,實(shí)現(xiàn)解耦和靈活擴(kuò)展,本文將探討如何結(jié)合SpringBoot實(shí)現(xiàn)職責(zé)鏈模式,優(yōu)化電商訂單處理流程
    2024-10-10
  • Java中id,pid格式數(shù)據(jù)轉(zhuǎn)樹和森林結(jié)構(gòu)工具類實(shí)現(xiàn)

    Java中id,pid格式數(shù)據(jù)轉(zhuǎn)樹和森林結(jié)構(gòu)工具類實(shí)現(xiàn)

    本文主要介紹了Java中id,pid格式數(shù)據(jù)轉(zhuǎn)樹和森林結(jié)構(gòu)工具類實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • springboot如何實(shí)現(xiàn)異步響應(yīng)請(qǐng)求(前端請(qǐng)求超時(shí)的問題解決)

    springboot如何實(shí)現(xiàn)異步響應(yīng)請(qǐng)求(前端請(qǐng)求超時(shí)的問題解決)

    這篇文章主要給大家介紹了關(guān)于springboot如何實(shí)現(xiàn)異步響應(yīng)請(qǐng)求(前端請(qǐng)求超時(shí)的問題解決)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-01-01
  • java程序遠(yuǎn)程debug原理與配置全過程

    java程序遠(yuǎn)程debug原理與配置全過程

    文章介紹了Java遠(yuǎn)程調(diào)試的JPDA體系,包含JVMTI監(jiān)控JVM、JDWP傳輸調(diào)試命令、JDI提供調(diào)試接口,通過-Xdebug、-Xrunjdwp參數(shù)配置調(diào)試模式,其中suspend控制程序是否等待調(diào)試器連接,解決程序閃退問題
    2025-09-09
  • Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)詳解

    Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)詳解

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-10-10
  • SpringCloud基于RestTemplate微服務(wù)項(xiàng)目案例解析

    SpringCloud基于RestTemplate微服務(wù)項(xiàng)目案例解析

    這篇文章主要介紹了SpringCloud基于RestTemplate微服務(wù)項(xiàng)目案例,在寫SpringCloud搭建微服務(wù)之前,先搭建一個(gè)不通過springcloud只通過SpringBoot和Mybatis進(jìn)行模塊之間通訊,通過一個(gè)案例給大家詳細(xì)說明,需要的朋友可以參考下
    2022-05-05
  • Java微信公眾平臺(tái)開發(fā)(13) 微信JSSDK中Config配置

    Java微信公眾平臺(tái)開發(fā)(13) 微信JSSDK中Config配置

    這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開發(fā)第十三步,微信JSSDK中Config配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • JeecgBoot頁面Online報(bào)表配置過程(動(dòng)態(tài))

    JeecgBoot頁面Online報(bào)表配置過程(動(dòng)態(tài))

    文章介紹了如何根據(jù)登錄者角色信息動(dòng)態(tài)配置報(bào)表,并詳細(xì)說明了Online報(bào)表的配置步驟,包括數(shù)據(jù)源選擇、字段顯示、查詢條件設(shè)置等,同時(shí),文章還涉及了頁面代碼部分,包括依賴引入、用戶信息獲取、參數(shù)配置和form表單配置等
    2026-01-01
  • SpringBoot如何讀取mock數(shù)據(jù)(高效調(diào)試接口)

    SpringBoot如何讀取mock數(shù)據(jù)(高效調(diào)試接口)

    本文介紹如何在SpringBoot項(xiàng)目中讀取resources目錄下的mock數(shù)據(jù)文件,以便高效調(diào)試接口,在 Spring Boot 項(xiàng)目中,通常會(huì)將靜態(tài)資源或配置文件放在 src/main/resources 目錄下,下面通過實(shí)例給大家詳細(xì)介紹,感興趣的朋友一起看看吧
    2024-12-12

最新評(píng)論

白朗县| 柳河县| 铜山县| 思南县| 玉溪市| 临沭县| 嘉义县| 林周县| 纳雍县| 柏乡县| 新平| 嘉荫县| 万山特区| 潮州市| 广宗县| 武宁县| 纳雍县| 深水埗区| 马尔康县| 安溪县| 海南省| 攀枝花市| 湘乡市| 吉水县| 仙桃市| 慈利县| 十堰市| 玛曲县| 花垣县| 民乐县| 大洼县| 育儿| 清水河县| 宣恩县| 伊金霍洛旗| 灵宝市| 泾源县| 甘德县| 宜川县| 加查县| 太仓市|