Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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_Abstract - Fatal编程技术网

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