1 changed files with 111 additions and 0 deletions
@ -0,0 +1,111 @@ |
|||
import java.lang.reflect.ParameterizedType; |
|||
import java.lang.reflect.Type; |
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
|
|||
public class Pair<K, V> { |
|||
private K first; |
|||
private V second; |
|||
|
|||
public Pair(K first, V second) { |
|||
this.first = first; |
|||
this.second = second; |
|||
} |
|||
|
|||
public K getFirst() { |
|||
return first; |
|||
} |
|||
|
|||
public void setFirst(K first) { |
|||
this.first = first; |
|||
} |
|||
|
|||
public V getSecond() { |
|||
return second; |
|||
} |
|||
|
|||
public void setSecond(V second) { |
|||
this.second = second; |
|||
} |
|||
|
|||
/** |
|||
* 安全地交换 Pair 中的两个元素。 |
|||
* 注意:这将创建一个新的 Pair 对象并返回,而不是修改原对象。 |
|||
*/ |
|||
public Pair<V, K> swapped() { |
|||
return new Pair<>(this.second, this.first); |
|||
} |
|||
|
|||
@Override |
|||
public String toString() { |
|||
return "Pair{first=" + first + ", second=" + second + '}'; |
|||
} |
|||
|
|||
public static class Cache<K, V> { |
|||
private final Map<K, V> cache = new HashMap<>(); |
|||
|
|||
public void put(K key, V value) { |
|||
cache.put(key, value); |
|||
} |
|||
|
|||
public V get(K key) { |
|||
return cache.get(key); |
|||
} |
|||
|
|||
public boolean containsKey(K key) { |
|||
return cache.containsKey(key); |
|||
} |
|||
|
|||
public void remove(K key) { |
|||
cache.remove(key); |
|||
} |
|||
|
|||
public int size() { |
|||
return cache.size(); |
|||
} |
|||
|
|||
// 为了能够通过反射获取泛型信息,需要让子类继承它
|
|||
public Class<?> getKeyType() { |
|||
return getGenericType(0); |
|||
} |
|||
|
|||
public Class<?> getValueType() { |
|||
return getGenericType(1); |
|||
} |
|||
|
|||
private Class<?> getGenericType(int index) { |
|||
Type genericSuperclass = this.getClass().getGenericSuperclass(); |
|||
if (genericSuperclass instanceof ParameterizedType) { |
|||
ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass; |
|||
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); |
|||
if (index >= 0 && index < actualTypeArguments.length) { |
|||
Type type = actualTypeArguments[index]; |
|||
if (type instanceof Class) { |
|||
return (Class<?>) type; |
|||
} |
|||
} |
|||
} |
|||
return Object.class; |
|||
} |
|||
} |
|||
|
|||
public static void main(String[] args) { |
|||
// 演示 Pair 的用法
|
|||
Pair<String, Integer> pair = new Pair<>("Hello", 100); |
|||
System.out.println("Original Pair: " + pair); |
|||
Pair<Integer, String> swappedPair = pair.swapped(); |
|||
System.out.println("Swapped Pair: " + swappedPair); |
|||
|
|||
// 演示 Cache 的用法和泛型类型获取
|
|||
// 必须创建一个匿名子类才能保留泛型信息供反射使用
|
|||
Cache<String, Integer> stringIntCache = new Cache<String, Integer>() {}; |
|||
stringIntCache.put("answer", 42); |
|||
stringIntCache.put("year", 2024); |
|||
|
|||
System.out.println("\n--- Cache Demo ---"); |
|||
System.out.println("Key type: " + stringIntCache.getKeyType().getSimpleName()); |
|||
System.out.println("Value type: " + stringIntCache.getValueType().getSimpleName()); |
|||
System.out.println("Size: " + stringIntCache.size()); |
|||
System.out.println("Value for 'answer': " + stringIntCache.get("answer")); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue