In der C++-Sprache gibt es eine sehr nützliche Vorlagenfunktion, die eine allgemeine Version mit parametrisierten Typen schreiben kann, sodass der Compiler automatisch spezifische Versionen für verschiedene Typen generieren kann. In der Java-Sprache gibt es eine ähnliche Funktion namens Generics. Beim Schreiben von Klassen und Methoden werden im Allgemeinen bestimmte Typen verwendet, und Generika können zum Parametrisieren von Typen verwendet werden, sodass allgemeinerer Code geschrieben werden kann.
Viele Leute glauben, dass die Konzepte von C++-Vorlagen und Java-Generika gleichwertig sind, aber tatsächlich sind die Implementierungsmechanismen völlig unterschiedlich. C++-Vorlagen sind eine Reihe von Makroanweisungen, und der Compiler erstellt eine Kopie des Vorlagencodes für jeden Typ. Die Implementierung von Java-Generika basiert auf dem Konzept der „Typlöschung“, bei dem es sich im Wesentlichen um einen syntaktischen Zucker für Typbeschränkungen handelt.
Nehmen Sie die unterstützende Klasse des Generikums:
/** 通用支撑类 */@Getter@Setter@ToStringpublic class GenericHolder<T> { /** 通用取值 */ private T value; /** 构造函数 */ public GenericHolder() {} /** 构造函数 */ public GenericHolder(T value) { this.value = value; } }
/** 数据提供者接口 */public interface DataProvider<T> { /** 获取数据函数 */ public T getData(); }
/** 浅拷贝函数 */public static <T> T shallowCopy(Object source, Class<T> clazz) throws BeansException { // 判断源对象 if (Objects.isNull(source)) { return null; } // 新建目标对象 T target; try { target = clazz.newInstance(); } catch (Exception e) { throw new BeansException("新建类实例异常", e); } // 拷贝对象属性 BeanUtils.copyProperties(source, target); // 返回目标对象 return target; }
/** 打印取值函数 */public static void printValue(GenericHolder<?> holder) { System.out.println(holder.getValue()); }/** 主函数 */public static void main(String[] args) { printValue(new GenericHolder<>(12345)); printValue(new GenericHolder<>("abcde")); }
/** 打印取值函数 */public static <T> void printValue(GenericHolder<T> holder) { System.out.println(holder.getValue()); }
Beim Bereitstellen von Daten als Produzent (Auslesen) ist es sinnvoll, Obergrenzen-Wildcards zu verwenden (erweitert);
Beim Konsumieren von Daten als Konsument (Einschreiben) ist es sinnvoll um untere Grenzen zu verwenden Wildcard (super). Bei der täglichen Codierung wird häufiger der Platzhalter für die Obergrenze (erweitert) verwendet, der zum Begrenzen der übergeordneten Klasse eines generischen Typs verwendet wird. Der Beispielcode lautet wie folgt:/** 数字支撑类 */@Getter@Setter@ToStringpublic class NumberHolder<T extends Number> { /** 通用取值 */ private T value; /** 构造函数 */ public NumberHolder() {} /** 构造函数 */ public NumberHolder(T value) { this.value = value; } }/** 打印取值函数 */public static <T extends Number> void printValue(GenericHolder<T> holder) { System.out.println(holder.getValue()); }
Das obige ist der detaillierte Inhalt vonWelche Auswirkungen hat die Typschutzfunktion von Generika in Java auf den Code?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!