Java如何实现泛型VariableStorage的set/get及ITextStorage的字符匹配计数?
实现步骤与可运行代码示例
一、实现VariableStorage类的set/get方法
现有代码的问题
- 你之前在
set方法内部定义的char T是局部变量,方法执行完成后就会被内存回收,完全无法在get方法中访问 - 错误将类的泛型标识
T作为普通变量类型定义,且变量名和泛型标识重名,存在语法错误
正确实现思路
要实现值的持久化存储,必须在类中定义与泛型类型一致的私有成员变量:set方法负责把传入的参数赋值给这个成员变量,get方法直接返回这个成员变量即可。
正确代码
public class VariableStorage<T> implements IVariableStorage<T> { // 私有成员变量,类型和类泛型T保持一致,用于持久化存储值 private T storedValue; @Override public void set(T var) { this.storedValue = var; } @Override public T get() { return storedValue; } }
二、实现ITextStorage接口
实现思路
因为ITextStorage继承自IVariableStorage,且泛型上界为CharSequence(即存储的内容一定是可转为字符序列的类型,如String、StringBuilder等),可以直接复用上面写好的VariableStorage的set/get逻辑,仅需额外实现countMatchingCharacters方法:
- 分别取出当前对象、对比对象中存储的文本内容
- 以两个文本的最小长度为遍历边界(超过短文本长度的位置不存在可对比的同位置字符)
- 逐位置对比同下标的字符,相等则累加匹配计数
你之前尝试创建两个数组做对比属于不必要的冗余操作:
CharSequence本身内置charAt(i)方法支持按下标直接取字符,无需转成数组即可完成对比。
实现代码
public class TextStorage<T extends CharSequence> extends VariableStorage<T> implements ITextStorage<T> { @Override public int countMatchingCharacters(ITextStorage<?> other) { CharSequence currentText = this.get(); CharSequence otherText = other.get(); // 空值边界处理,避免空指针异常 if (currentText == null || otherText == null) { return 0; } int matchCount = 0; // 取两个文本的最小遍历长度,防止下标越界 int compareMaxLength = Math.min(currentText.length(), otherText.length()); for (int i = 0; i < compareMaxLength; i++) { if (currentText.charAt(i) == otherText.charAt(i)) { matchCount++; } } return matchCount; } }
效果校验
以题目给出的示例abcdef和abba为例:
- 可对比的最大长度为min(6,4)=4
- 逐位对比结果:第0位a/a匹配、第1位b/b匹配、第2位c/b不匹配、第3位d/a不匹配
- 最终返回匹配数2,和示例描述完全一致。
内容的提问来源于stack exchange,提问作者hans
相关产品推荐
相关产品推荐

