Java 其中是枚举<;T>;实施?
我是一名C#Unity3D开发人员,最近我不得不跳入Java为我正在开发的android游戏创建插件。简单地说,这个插件的目的是使用java网络功能,这样玩家就可以在手机上广播他们正在主持的比赛,让其他人在局域网上找到 对于这个插件,我需要获得设备上的所有网络接口,过滤掉任何本地链接或环回IP,然后(假设只有一个剩余地址,应该有)使用剩余地址进行广播。我已经成功地做到了这一点,但我还是忍不住被这一行代码所困扰:Java 其中是枚举<;T>;实施?,java,Java,我是一名C#Unity3D开发人员,最近我不得不跳入Java为我正在开发的android游戏创建插件。简单地说,这个插件的目的是使用java网络功能,这样玩家就可以在手机上广播他们正在主持的比赛,让其他人在局域网上找到 对于这个插件,我需要获得设备上的所有网络接口,过滤掉任何本地链接或环回IP,然后(假设只有一个剩余地址,应该有)使用剩余地址进行广播。我已经成功地做到了这一点,但我还是忍不住被这一行代码所困扰: Enumeration<NetworkInterface> interf
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
Enumeration interfaces=NetworkInterface.getNetworkInterfaces();
最近我对事物的内部运作越来越好奇。Unity3D有一个很棒的API和文档,但最近我一直在使用附带的IDE(MonoDevelop)来查看他们的托管源代码,以帮助我更好地理解事情是如何完成的,所以这个问题真的再次帮助了我的好奇心
因此,枚举是一个隐式抽象的接口,其函数也是隐式抽象的,这意味着类必须实现它来定义其函数的行为
查看docs.oracle.com上的NetworkInterface,它似乎没有实现枚举,但它有一个函数(如上图所示),可以向我返回NetworkInterface类型的枚举,并带有一个正常工作的nextElement()函数。不仅如此,因为枚举是一个接口,一个函数怎么能为我提供一个接口呢?接口,像抽象类一样,不能被实例化,但是我已经得到了这个枚举实例,它有我可以调用的定义函数,它保存着我所要求的网络接口
如果它返回给我一个实现枚举的某种(显然是非抽象的)类型的对象,可能持有NetworkInterface类型的私有数组,我认为所有这些对我来说都更有意义
查看docs.oracle.com上的NetworkInterface,它似乎没有实现枚举
没错,NetworkInterface
本身实现枚举
,没有多大意义,因为它不是枚举。相反,它有一个内部类,用于实现枚举
,它是从getNetworkInterfaces
接收的类的实例
这是一种常见的模式。您可以在JDK安装的src.zip
中的NetworkInterface.java
文件中看到实现:
public static Enumeration<NetworkInterface> getNetworkInterfaces()
throws SocketException {
final NetworkInterface[] netifs = getAll();
// specified to return null if no network interfaces
if (netifs == null)
return null;
return new Enumeration<NetworkInterface>() { // This is the
private int i = 0; // anonymous
public NetworkInterface nextElement() { // inner class used
if (netifs != null && i < netifs.length) { // to implement
NetworkInterface netif = netifs[i++]; // Enumeration<NetworkInterface>
return netif; //
} else { //
throw new NoSuchElementException(); //
} //
} //
//
public boolean hasMoreElements() { //
return (netifs != null && i < netifs.length); //
} //
}; //
}
公共静态枚举getNetworkInterfaces()
抛出SocketException{
最终网络接口[]netifs=getAll();
//指定为在没有网络接口时返回null
如果(netifs==null)
返回null;
返回新枚举(){//这是
private int i=0;//匿名
public NetworkInterface nextElement(){//使用了内部类
如果(netifs!=null&&iAbstractList.java
中的Itr
(也在src.zip
中)
查看docs.oracle.com上的NetworkInterface,它似乎没有实现枚举
没错,NetworkInterface
本身实现枚举
,没有多大意义,因为它不是枚举。相反,它有一个内部类,用于实现枚举
,它是从getNetworkInterfaces
接收的类的实例
这是一种常见的模式。您可以在JDK安装的src.zip
中的NetworkInterface.java
文件中看到实现:
public static Enumeration<NetworkInterface> getNetworkInterfaces()
throws SocketException {
final NetworkInterface[] netifs = getAll();
// specified to return null if no network interfaces
if (netifs == null)
return null;
return new Enumeration<NetworkInterface>() { // This is the
private int i = 0; // anonymous
public NetworkInterface nextElement() { // inner class used
if (netifs != null && i < netifs.length) { // to implement
NetworkInterface netif = netifs[i++]; // Enumeration<NetworkInterface>
return netif; //
} else { //
throw new NoSuchElementException(); //
} //
} //
//
public boolean hasMoreElements() { //
return (netifs != null && i < netifs.length); //
} //
}; //
}
公共静态枚举getNetworkInterfaces()
抛出SocketException{
最终网络接口[]netifs=getAll();
//指定为在没有网络接口时返回null
如果(netifs==null)
返回null;
返回新枚举(){//这是
private int i=0;//匿名
public NetworkInterface nextElement(){//使用了内部类
如果(netifs!=null&&i