Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java方法重写中使用通配符_Java_Generics_Inheritance_Wildcard_Overriding - Fatal编程技术网

在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);