0

这个问题的背景可以从我之前的问题中找到。

上一个问题:http ://tinyurl.com/chq4w7t

我有一个Comm带有发送功能的接口:

public interface Comm
{
    public int send(Socket socket, byte[] bytes);
}

我有各种实现接口的类(Server, Client,Serial等)Comm。我可以将这些类对象作为参数传递给另一个类中的另一个发送函数,该函数充当Comm对象和各种插件之间的管理器,这些插件可配置为使用这些Comm类中的一个作为通信媒介。

( Server, Client, Serial, 等) 可以作为参数传递给下面的发送函数

public void Send(Comm com, Socket socket, byte[] message)
{
    com.send(null, message);
}

从我之前的问题中,我有一个getClasses返回 aClass[]并将 String 作为参数的函数。这用于提供不同的配置选项。

例如,我使用为客户端Class.forName("Client");返回一个Class对象。

现在最后我的问题如下:

如何转换ClassComm类型?我做了以下尝试让您了解:(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);
4

1 回答 1

5

您不能从Class对象转换为类的实例。您需要创建一个实例,例如使用以下Class.newInstance()方法:

Comm com = classComm.newInstance();

请注意,这需要类中的公共无参数构造函数。你的代码总是这样吗?如果没有,您将需要获取适当的构造函数并使用反射调用它,这将变得有点复杂。

顺便说一句,我很惊讶这对你有用:

Class<? extends Comm> classComm = Class.forName(...);

没有什么真正检查返回的类forName将实现Comm。我本来希望这是必需的:

Class<?> classComm = Class.forName();
Comm comm = (Comm) classComm.newInstance();

届时,演员执行适当的检查。

于 2013-05-16T06:09:25.490 回答