在java方法重写中使用通配符
大多数泛型和通配符的示例都涉及集合,但我正在尝试学习如何仅在类中使用它们。我想学习这种更现代的泛型方法,这样我就可以避免当子类重写超类中的方法时出现的尴尬的转换 我有一个用于猜测游戏的抽象类,它可能用于数字猜测游戏、单词猜测游戏,甚至是智囊团。游戏包中包含了级别和分数的抽象类。然后,我想对猜谜游戏进行子类化,并对级别和分数进行子类化,以制作一个特定的游戏 下面是分数的抽象类:在java方法重写中使用通配符,java,generics,inheritance,wildcard,overriding,Java,Generics,Inheritance,Wildcard,Overriding,大多数泛型和通配符的示例都涉及集合,但我正在尝试学习如何仅在类中使用它们。我想学习这种更现代的泛型方法,这样我就可以避免当子类重写超类中的方法时出现的尴尬的转换 我有一个用于猜测游戏的抽象类,它可能用于数字猜测游戏、单词猜测游戏,甚至是智囊团。游戏包中包含了级别和分数的抽象类。然后,我想对猜谜游戏进行子类化,并对级别和分数进行子类化,以制作一个特定的游戏 下面是分数的抽象类: // a score is a measure of how close a guess is to being cor
// a score is a measure of how close a guess is to being correct
public abstract class Score{
public abstract boolean equals(Class<? extends Score> otherScore);
public abstract boolean isWin(Class<? extends Level> level);
}
这不会编译,因为它认为我没有正确地重写抽象超类所需的方法。因此,即使子类的isWin方法有一个参数是Level的子类,它也不会将其识别为预期的类型
然后,我将Level子类的类声明行更改为如下所示:
public class MastermindLevel<T extends games.Level>{
public final int numColors;
public final int numSlots;
public MastermindLevel(int numColors, int numSlots, int maxGuesses){
super(maxGuesses);
this.numColors = numColors;
this.numSlots = numSlots;
}
}
公共类主控级别{
公共最终国际货币基金组织;
公共最终国际numSlots;
公共主控级别(int numColors、int numslot、int maxGuesses){
超级(最大猜测);
this.numColors=numColors;
this.numSlots=numSlots;
}
}
然而,当我这样做时,对超类构造函数的调用不起作用,因为它认为我的类是Object的子类,而不是Level的子类
我知道我可以通过使用超类的参数编写重写的方法,然后将Level和Score强制转换为MastermindLevel和MastermindScore,从而使代码正常工作,但我希望了解如何/如果可以使用泛型实现这一点。我真的很想更彻底地理解泛型
感谢您的帮助。请注意,在抽象类
Score
中,您的方法正在接受java.lang.class
对象
然而,在您的类
MastermindScore
中,您使用类型MastermindScore
和mastermindslevel
作为方法参数。这是行不通的,因为类型与超类中的类型不同,MastermindScore
不是Class的子类。您不能这样做,您的方法声明:
public abstract boolean isWin(Class<? extends Level> level);
这是一种通用方法。但是这并没有给你的代码增加太多,因为当你使用L
时,编译器只能说L
是一个级别
——你仍然需要强制转换
因此,您真正需要的是一个通用的接口
:
public interface Score<L> {
boolean isWin(L level);
}
显然,MastermindLevel
需要extensedlevel
还要注意,equals
被实现为equals(Object other)
,因此您必须强制转换。你不应该有一个equals(MyType other)
方法。你做错了。您很可能需要类似于布尔isWin(T级别)
的东西。谢谢,杰斯珀。它现在可以编译了,不过我得到一个警告:games.Score是原始类型。对泛型游戏的引用。分数应该参数化
你能帮我理解这里的概念吗?我很感激。这是因为Score
是S,L
中的泛型,方法equals
采用Score
而没有泛型-rawtype。由于这个原因,这种方法有点缺陷。在任何情况下,equals
如果要覆盖equals
方法,则应使用对象。实际上,警告出现在超类公共抽象类分数的类声明行上{
我确实理解从类对象重写equals方法需要一个对象的参数,但我并没有试图重写该方法。我只是使用equals这个名称,因为它很好地描述了我想要的东西,以查看一个分数是否与另一个相同。@NinaKoch原因是相同的-分数
是parametrised,声明不存在。特别是在S中使用Score
扩展了Score
。
public abstract boolean isWin(Class<? extends Level> level);
public abstract<L extends Level> boolean isWin(L level);
public interface Score<L> {
boolean isWin(L level);
}
public class MastermindScore implements Score<MastermindLevel> {
boolean isWin(MastermindLevel level);