- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
说实话,我不太确定我自己是否理解这个任务:) 我被告知创建类 MySimpleIt,它实现 Iterator 和 Iterable,并允许运行提供的测试代码。对象的参数和变量不能是集合或数组。
代码:
MySimpleIt msi=new MySimple(10,100,
MySimpleIt.PRIME_NUMBERS);
for(int el: msi)
System.out.print(el+" ");
System.out.println();
msi.setType(MySimpleIterator.ODD_NUMBERS);
msi.setLimits(15,30);
for(int el: msi)
System.out.print(el+" ");
System.out.println();
msi.setType(MySimpleIterator.EVEN_NUMBERS);
for(int el: msi)
System.out.print(el+" ");
System.out.println();
我应该得到的结果:
11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
15 17 19 21 23 25 27 29
16 18 20 22 24 26 28 30
这是我的代码:
import java.util.Iterator;
interface MySimpleIterator{
static int ODD_NUMBERS=0;
static int EVEN_NUMBERS = 1;
static int PRIME_NUMBERS = 2;
int setType(int i);
}
public class MySimpleIt implements Iterable, Iterator, MySimpleIterator {
public MySimple my;
public MySimpleIt(MySimple m){
my = m;
}
public int setType(int i){
my.numbers = i;
return my.numbers;
}
public void setLimits(int d, int u){
my.down = d;
my.up = u;
}
public Iterator iterator(){
Iterator it = this.iterator();
return it;
}
public void remove(){
}
public Object next(){
Object o = new Object();
return o;
}
public boolean hasNext(){
return true;
}
}
class MySimple {
public int down;
public int up;
public int numbers;
public MySimple(int d, int u, int n){
down = d;
up = u;
numbers = n;
}
}
在测试代码中,创建 MySimpleIt msi 对象时出现错误,因为它找到的是 MySimple 而不是 MySimpleIt。另外,我在 for-each 循环中遇到错误,因为编译器需要“int”而不是“Object”。有人知道如何解决这个问题吗?
最佳答案
这个作业的设计有很多错误。
enum
测试代码包含以下片段:
MySimpleIt(erator?).PRIME_NUMBERS
MySimpleIt(erator?).ODD_NUMBERS
MySimpleIt(erator?).EVEN_NUMBERS
在一个地方,类型是 MySimpleIt
,在另一个中是 MySimpleIterator
。不管怎样,顾名思义,就是使用接口(interface)来定义一堆常量。这不是 interface
的正确使用!!!
使用 enum
会是一个更好的设计相反:
enum SequenceType {
PRIME_NUMBERS, ODD_NUMBERS, EVEN_NUMBERS;
}
参见:Effective Java 第二版 第 30 项:使用枚举代替 int
常数。
interface
的多种实现而不是 setType
的整体看起来你的音序器应该能够随心所欲地切换音序类型。这将导致该类成为一个巨大的 Blob ,它必须知道如何生成每种类型的序列。它可能仅适用于此处给出的 3 种类型,但如果您稍后想要添加更多类型的序列,这绝对是一个糟糕的设计。
考虑对不同类型的序列使用同一接口(interface)的不同实现。您可能想要定义 AbstractIntegerSequencer
它定义了委托(delegate)给 hasNext()
的基本功能(重置边界、回答 iterator()
、 abstract protected int generateNext()
等)。对于子类 @Override
。这样,要生成的序列类型的细节就可以很好地封装到每个子类中。
您仍然可以保留enum SequenceType
对于static
实例化这些不同子类的工厂方法,每个子类对应一种序列类型,但这些序列本身可能不应该能够随心所欲地切换类型。
而不是输入 implements Iterator
,你应该做到 implements Iterator<Integer>
.
来自JLS 4.8 Raw Types (强调他们的):
The use of raw types is allowed only as a concession to compatibility of legacy code. The use of raw types in code written after the introduction of genericity into the Java programming language is strongly discouraged. It is possible that future versions of the Java programming language will disallow the use of raw types.
另请参阅《Effective Java 第 2 版》第 32 条:不要在新代码中使用原始类型。
<小时/>Iterator<T>
与 Iterable<T>
.假设你有这样的东西:
IntegerSequencer seq = new PrimeSequencer(0, 10);
for (int i : seq) {
System.out.println(i);
} // prints "2", "3", "5", 7"
for (int i : seq) {
System.out.println(i);
} // what should it print???
如果你做seq implements Iterable<Integer>, Iterator<Integer>
和@Override Iterator<Integer> iterator()
至return this;
,那么第二个循环不会打印任何内容,因为 seq
是它自己的iterator()
,此时不再有 hasNext()
对于 seq
.
Iterable<Integer>
的正确实现应该能够生成尽可能多的独立Iterator<Integer>
根据用户的需要,这样的实现将再次打印 0
之间的素数和10
在上面的代码中。
PrimeGenerator implements Iterator<Integer>
(除其他外)关于java - 接口(interface)的更高级用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619800/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!