java - 如何在java中增加泛型类型值
问题描述
我的任务是将给定类转换为抽象和泛型类,生成泛型类型的值序列,并支持接受初始值的单个构造函数。
这是给定的类:
public class Progression {
protected long current;
public Progression(){
this.current=0;
}
public Progression(long start){
this.current=start;
}
public long nextValue(){
long answer= current;
advance();
return answer;
}
protected void advance(){
current++;
}
public void printProgression(int n){
System.out.println(nextValue());
for(int j=0;j<n;j++){
System.out.println(" "+nextValue());
}
System.out.println();
}
}
我做了这样的变换:
abstract class ReProgression<T> {
protected T current;
public ReProgression(T start){
current=start;
}
public T nextValue(){
T answer= current;
advance();
return answer;
}
public void advance(){
}
public void printProgression(int n){
System.out.println(nextValue());
for(int j=0;j<n;j++){
System.out.println(" "+nextValue());
}
System.out.println();
}
}
如何提前()函数增加通用值“当前”?
解决方案
可能的解决方案 1
进展是一个需要定义的术语。在您最初的示例中Progression
,您正在推进 a long
,因此很容易确定如何推进。只是增加数字。当您将它从 long 转换为泛型类型时,您不再知道该类型是什么(因此是泛型),因此您必须以某种方式定义如何前进。泛型类型 T必须在它“前进”时定义 bavious。在 Java 中执行此操作的标准方法是使用接口
我会创造这样的东西 -
public interface Advancable{
public void advance();
}
在你的ReProgression
课堂上,你会像这样使用这个界面 -
abstract class ReProgression<T extends Advancable> {
protected T current;
public ReProgression(T start){
current=start;
}
public T nextValue(){
T answer= current;
advance();
return answer;
}
public void advance(){
current.advance();
}
public void printProgression(int n){
System.out.println(nextValue());
for(int j=0;j<n;j++){
System.out.println(" "+nextValue());
}
System.out.println();
}
}
这就是解决方案。但是,我应该讨论如何调用代码。在最初的示例Progression
中,您可以这样称呼它,例如 -
Progression p = new Progression(1);
p.printProgression(5);
哪个会产生输出
1
2
3
4
5
要对 做同样的事情ReProgression
,您可能会像这样调用它 -
MyAdvancable<Long> startValue = new MyAdvancable<Long>(5);
ReProgression rp = new ReProgression(startValue);
rp.printProgression(5);
但是您还需要定义 MyAdvancable
可能的解决方案 2
你自己几乎有正确的答案。您的问题是“将给定的类转换为抽象和通用类”。声明一个抽象类只有在至少有一个抽象方法时才有意义。通常这是因为在编写代码时行为是未知的或未定义的。这听起来很像您在问题中评论的未知“推进”机制。所以你所拥有的几乎就是你的解决方案。只需删除 Advance() 方法的主体 -
abstract class ReProgression<T> {
protected T current;
public ReProgression(T start){
current=start;
}
public T nextValue(){
T answer= current;
advance();
return answer;
}
abstract void advance();
public void printProgression(int n){
System.out.println(nextValue());
for(int j=0;j<n;j++){
System.out.println(" "+nextValue());
}
System.out.println();
}
}
我有两个解决方案的原因是因为从您的问题来看,并且没有更多关于您本书当前章节中涵盖哪些主题的背景,对我而言,这两个都是可能的,如果您需要决定其中哪一个,如果任何,可能是你的解决方案。祝您学习 Java 的旅途顺利!
推荐阅读
- c# - Selenium Webdriver 与 C# 有没有办法滚动鼠标滚轮?
- google-apps-script - 谷歌表格(谷歌财经) - 一次获取股票价格并跟踪
- time-series - 使用 AICc 使用 TSLM 选择滞后预测变量
- polymer - 在 Polymer 3 元素或 lit-elements 中加载普通 JavaScript
- java - 实时firebase分页时删除重复项的算法
- logging - 播放框架 2.6 访问日志不起作用
- ios - iOS13 OnDevice 语音识别(supportsOnDeviceRecognition 标志)
- firebase - iOS Firebase 推送通知在生产中的 iPhone 11 上不起作用
- json - 使用 jsonschema 验证值组合
- swift - 单击 NSStatusItem 时如何赋予 NSPopover 焦点?