这个问题的背景可以从我之前的问题中找到。
上一问题:http://tinyurl.com/chq4w7t
我有一个带有发送功能的接口(interface)Comm
:
public interface Comm
{
public int send(Socket socket, byte[] bytes);
}
我有各种类(Server
、Client
、Serial
等),它们实现了 Comm
接口(interface)。我可以将这些类对象作为参数传递给另一个类中的另一个发送函数,该类充当 Comm
对象和各种插件之间的管理器,这些插件可配置为使用其中一个 Comm
> 类作为沟通媒介。
(服务器
、客户端
、串行
等)可以作为参数传递给下面的发送函数
public void Send(Comm com, Socket socket, byte[] message)
{
com.send(null, message);
}
根据我之前的问题,我有一个 getClasses
函数,它返回一个 Class[]
并接受一个 String 作为参数。这用于提供不同的配置选项。
例如,我使用 Class.forName("Client");
为 Client 返回一个 Class
对象。
现在我的问题如下:
如何从 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);
最佳答案
您无法将 Class
对象转换为该类的实例。您需要创建一个实例,例如与 Class.newInstance()
方法:
Comm com = classComm.newInstance();
请注意,这需要类中存在公共(public)无参数构造函数。您的代码中总是这样吗?如果没有,您需要获取适当的构造函数并使用反射调用它,这会变得更加复杂。
顺便说一句,我很惊讶这对你有用:
Class<? extends Comm> classComm = Class.forName(...);
没有任何东西真正检查 forName
返回的类是否实现 Comm
。我本以为这是必需的:
Class<?> classComm = Class.forName();
Comm comm = (Comm) classComm.newInstance();
此时, Actor 将执行适当的检查。
关于java - 从类类型转换为引用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16580105/