Java通用抽象方法参数
我试图更好地理解抽象,但遇到了一个问题 我有以下课程: 抽象类:Java通用抽象方法参数,java,abstract,Java,Abstract,我试图更好地理解抽象,但遇到了一个问题 我有以下课程: 抽象类: public abstract class Box { abstract <T extends Mass> void putMassInBox(T mass); } 下面的一个会导致一个错误,因为它不能将一个平方质量识别为一个质量,或者我告诉它的方法不正确 public class SquareBox extends Box { @Override void putMassInBox(Squ
public abstract class Box {
abstract <T extends Mass> void putMassInBox(T mass);
}
下面的一个会导致一个错误,因为它不能将一个平方质量识别为一个质量,或者我告诉它的方法不正确
public class SquareBox extends Box {
@Override
void putMassInBox(SquareMass mass) {
// TODO Auto-generated method stub
}
}
以下是大众界面:
public interface Mass {
}
下面是它的实现:
public class CircleBox extends Box {
@Override
void putMassInBox(Mass mass) {
CircleMass circleMass = (CircleMass) mass;
}
}
public class CircleMass implements Mass {
}
public class SquareMass implements Mass {
}
所以我想强制一个方法,该方法根据它的实现获取参数。我知道我可以像circleMass例子中那样投射质量,但我想知道这是否是最好的方法?是否有可能强制一个方法接受扩展不同对象的任何对象?是否值得付出额外的努力,或者是否正在铸造这种抽象的标准方法。您必须使类通用,而不是方法:
public abstract class Box<T extends Mass> {
abstract void putMassInBox(T mass);
}
public class CircleBox extends Box<CircleMass> {
@Override
void putMassInBox(CircleMass mass) {
}
}
公共抽象类框{
抽象空穴putMassInBox(T质量);
}
公共类CircleBox扩展框{
@凌驾
无效putMassInBox(圆形质量){
}
}
您必须使类成为泛型,而不是方法:
public abstract class Box<T extends Mass> {
abstract void putMassInBox(T mass);
}
public class CircleBox extends Box<CircleMass> {
@Override
void putMassInBox(CircleMass mass) {
}
}
公共抽象类框{
抽象空穴putMassInBox(T质量);
}
公共类CircleBox扩展框{
@凌驾
无效putMassInBox(圆形质量){
}
}
这似乎不直观,但它确实有效,而且你有大量的代表,因此它必须是正确的做事方式。非常感谢。但是为什么呢?为什么我们需要这样做?@KimchiMan如果只将方法设置为泛型,那么该方法将接受任何T extends Mass
,而不受您希望在此处使用的Mass
的实际子类的约束。并且子类方法不能对类型签名施加额外的限制(它必须接受对其覆盖的方法有效的所有参数)。要建立连接,您需要让每个子类状态都具有它希望在相关方法中接受的Mass
。非常感谢。但是为什么呢?为什么我们需要这样做?@KimchiMan如果只将方法设置为泛型,那么该方法将接受任何T extends Mass
,而不受您希望在此处使用的Mass
的实际子类的约束。并且子类方法不能对类型签名施加额外的限制(它必须接受对其覆盖的方法有效的所有参数)。要建立连接,您需要在相关方法中使每个子类状态具有它想要接受的Mass
。