这个问题的背景可以从我之前的问题中找到.
上一个问题:http://tinyurl.com/chq4w7t
我有一个Comm带发送功能的界面:
public interface Comm
{
public int send(Socket socket, byte[] bytes);
}
Run Code Online (Sandbox Code Playgroud)
我具有各种类(Server,Client,Serial它实现了接口等)Comm.我可以将这些类对象作为参数传递给另一个类中的另一个发送函数,该类充当Comm对象和各种插件之间的管理器,这些插件可配置为使用这些Comm类之一作为通信介质.
(Server,Client,Serial,等等)可以被作为参数传递到下面的发送功能
public void Send(Comm com, Socket socket, byte[] message)
{
com.send(null, message);
}
Run Code Online (Sandbox Code Playgroud)
从我之前的问题我有一个getClasses函数,它返回一个Class[]并将String作为参数.这用于提供不同的配置选项.
我用Class.forName("Client");例如返回ClassClient 的对象.
现在最后我的问题如下:
如何转换Class为Comm类型?我做了以下尝试以获得一个想法:( cboxComm是一个用于测试我的代码的测试组合框.它包含Comm对象的类名)
// Some code I have no idea how it works, an explanation would be awesome
// regarding the diamond syntax
Class<? extends Comm> classComm = Class.forName(cboxComm.getSelectedItem().toString());
// Error here, I don't know how to convert or cast it
Comm com = classComm;
// Sending function as described above
send(com, null, null);
Run Code Online (Sandbox Code Playgroud)
您无法将Class对象转换为类的实例.您需要创建一个实例,例如使用以下Class.newInstance()方法:
Comm com = classComm.newInstance();
Run Code Online (Sandbox Code Playgroud)
请注意,这需要类中的公共无参数构造函数.您的代码中总是如此吗?如果没有,您将需要获取适当的构造函数并使用反射调用它,这将变得更复杂.
顺便说一句,我很惊讶这对你有用:
Class<? extends Comm> classComm = Class.forName(...);
Run Code Online (Sandbox Code Playgroud)
没有什么能真正检查返回的类forName是否会实现Comm.我原以为这是必须的:
Class<?> classComm = Class.forName();
Comm comm = (Comm) classComm.newInstance();
Run Code Online (Sandbox Code Playgroud)
此时,演员将执行适当的检查.