首页 / JAVA / 实现接口方法Java的子类型
实现接口方法Java的子类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了实现接口方法Java的子类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1829字,纯文字阅读大概需要3分钟。
内容图文
我一直在研究Java中的泛型类和方法,并在上一篇论文中遇到了这个问题
我尝试实现问题中提出的接口和类,包括加油方法,但发现将Car参数作为参数传递没有问题
电动接口
public interface Motorized {
public int getFuel();
}
车辆类别
public abstract class Vehicle{
private int fuel;
public Vehicle(int fuel) {
this.fuel = fuel;
}
public String toString(){
return("Fuel is: " + getFuel());
}
public int getFuel() {
return fuel;
}
}
车类
public class Car extends Vehicle implements Motorized {
int seats;
public Car(int fuel, int seats) {
super(fuel);
this.seats = seats;
}
public int getSeats() {
return seats;
}
@Override
public String toString(){
return("Fuel is: " + getFuel() + "and the car has" + getSeats() + "seats.");
}
}
测试方法
public class VehicleTest {
public static Motorized refuel(Motorized v) {
return v;
}
public static void main(String[] args) {
Car car = new Car(15, 5);
System.out.println(refuel(car));
}
}
有人可以向我解释这个问题应该是什么问题,为什么我的实现不能反映这个问题?
解决方法:
问题在于方法的返回值:
public static Motorized refuel(Motorized v)
您说过乘车没有问题,这是完全有效的声明.但是您尚未尝试从加油方法中获取价值:
Car car = ...
Car refueled = refuel(car); // compiler error: Motorized is not assignable to Car!
尽管Car扩展了Motorized,但返回类型为Motorized,但不能确定返回的Motorized实例将始终是Car.请参阅以下简化示例:
public static Motorized refuel(Motorized v) {
// try to refuel
// uh oh... the gas station exploded
// you have to change to a motorbike which just stands around
return new Motorbike();
}
现在,您可能期望拥有一辆汽车,但您会得到一辆摩托车,因此连演员表都失败了:
Car refueled = (Car) refuel(car); // ClassCastException, Motorbike is not a Car
您可以使用泛型来做到这一点:
public static <M extends Motorized> M refuel(M m) {
// refuel the motorized vehicle
return m;
}
尽管如果加油站再次爆炸,则该方法将有问题.它不知道M到底是什么.因此,这可能是您头痛的救星.
内容总结
以上是互联网集市为您收集整理的实现接口方法Java的子类型全部内容,希望文章能够帮你解决实现接口方法Java的子类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。