0

今天我迷失在 Java 多态性中。我做了一些我认为不可能的事情。即 - 我有扩展界面。

我创建了空界面:

public interface Figure {}

目前没有什么新鲜事。然后我创建了参数化类 Board,它带有扩展我的界面的参数!

public class Board< T extends Figure > { 
    T[][] board;
}

我以为不可能!尽管如此,我还是在不理解的情况下走得更远。

我创建了实现 Figure 接口的类:

public class Cross implements Figure{}

令我惊讶的是,我能够做到这一点:

Board b = new Board<Cross>();

请帮助我并向我解释这种奇怪的情况。
我对多态性略知一二,明白Cross就是Figure。我很困惑为什么任何类型都能够扩展接口,而实现接口(不扩展接口)的类如何作为扩展接口的参数是正确的。

请帮助我并解释这种多态混乱。谢谢。

4

3 回答 3

1

当您说public class Board< T extends Figure >时,这意味着 Board 可以接受实现这些接口Figure的任何一个或子接口或任何类。Figure所以,当你说:

public class Cross implements Figure{}

Board b = new Board<Cross>();

这意味着 Cross 已经实现Figure,因此Board可以接受Cross,因为CrossIS-AFigure

就扩展接口而言,只有接口才能扩展接口。因此,以下内容是合法的:

public interface TwoDimensionalFigure extends Figure{}.

所以任何实现的类TwoDimensionalFigure也可以被Board.

于 2013-04-29T07:13:55.170 回答
1

通过做

public class Board< T extends Figure > { 
    T[][] board;
}

您正在创建一个有界泛型类型,T它应该有它的类型 Figure

正如该线程中所解释的,定义扩展接口的泛型类型之间没有区别。

编译器确保的是,当您创建时BoardT将提供任何具体的类,extends Figure或者implements Figure

于 2013-04-29T07:14:22.730 回答
0

实际上你没有扩展接口。您只需创建一个类型为 Cross 的泛型类。您的类的定义仅指定参数化类型必须从 Figure 派生,即实现 Figure 或派生自它。

于 2013-04-29T07:15:38.923 回答