我写了一个简单的接口继承示例来说明我正在尝试做什么。
interface Fruit{
public void taste();
}
class Banana implements Fruit {
public String name = "Banana";
public void taste(){
System.out.println("yummy banana!");
}
class Strawberry implements Fruit {
public String name = "Strawberry";
public void taste(){
System.out.println("yummy strawberry!");
}
}
class Lunch<Fruittype implements Fruit> {
public Fruittype fruit;
public void tasteit() {
System.out.println("I'm going to eat a"+ fruit.name + "!" );
// error: name cannot be resolved or is not a field
fruit.taste();
}
}
class exec {
public static void main(String[] args) {
Lunch<Banana> bananalunch = new Lunch<>;
bananalunch.fruit = new Banana();
bananalunch.tasteit();
}
}
香蕉和草莓正在实施水果。在午餐班我试图称之为水果名称及其功能味道(); 虽然调用函数的味道很好,但我无法调用名称(请参阅:注释中的错误)
通缉输出: 我要去吃香蕉! 美味的香蕉!
就像我说的,美味的香蕉有效,但名称无法解决。我试图声明“public String name =”default“”;在Fruit界面中。然后你可以调用它,但它总是会说“默认”而不是实际类中的名字。
有没有办法获得实现接口的泛型类型的成员? 附:我需要像这样做,当然这个代码仅用于表示,但我有一个更大的更复杂的代码,我遇到了这个问题 - 如果没有必要,我不想重组它。
提前谢谢!
答案 0 :(得分:3)
您的问题是由于尝试直接访问实例成员而引起的 - fruit.name
- 而不是通过方法 - fruit.getName()
。
如果使用getter方法,将执行正确的方法并返回所需的输出。
也就是说,在这个特定的例子中,在基类中使用单个getName()
方法,在该基类中使用单个_name
变量更有意义,该变量初始化为不同的价值根据实际的水果类别而定。
另一方面,看到您的Fruit
是接口而不是基类,您可以让实现该接口的每个类都使用getName()
方法返回不同的值。 / p>
例如:
class Strawberry implements Fruit {
public String name = "Strawberry";
public void taste(){
System.out.println("yummy strawberry!");
}
}
会变成:
class Strawberry implements Fruit {
public String getName () {
return "Strawberry";
}
public void taste() {
System.out.println("yummy strawberry!");
}
}
您必须将getName()
添加到界面:
interface Fruit {
public String getName();
public void taste();
}
最后,您的Lunch
课程变为:
class Lunch<Fruittype implements Fruit> {
public Fruittype fruit;
public void tasteit() {
System.out.println("I'm going to eat a "+ fruit.getName() + "!" );
fruit.taste();
}
}
答案 1 :(得分:0)
当类实现接口时,意味着此类的对象可以执行接口中描述的操作。
例如,每个平面形状都有面积。所以我们可以确定界面:
interface PlaneShape {
int getArea();
}
正方形区域是边缘的乘积。而圆的面积是产品 由pi数除以2的平方半径。所以:
class Square implements PlaneShape {
public int edge = 5;
public int getArea() {
return edge*edge;
}
}
class Circle implements PlaneShape {
public int radius = 5;
public int pi = 3.14;
public int getArea() {
return radius*radius*pi/2;
}
}
接口用于抽象。 AreaCalculator以平面形状运行,因此它从任何特定类型的平面形状中抽象出来。 AreaCalculator只知道任何形状都可以通过执行getArea()方法给出区域值。 AreaCalculator不了解特殊形状字段,例如edge
或radius
。
class AreaCalculator<S implemets PlaneShape> {
public S shape;
public int calculateArea() {
shape.getArea();
}
}
通过这种方式,在您的示例中,Lunch<Fruittype implements Fruit>
班级对水果内部名称一无所知,但它并没有&#34;看到&#34;这个字段,它只能调用方法taste()
。您需要将方法getName()
添加到接口,并实现它。
关于界面中name="default"
的主题。它在接口的上下文中声明,并且与实现没有任何关系。