2013-05-16 29 views
0

可以从我以前的问题找到这个问题的背景。从类的类型转换为引用类

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

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

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

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

ServerClientSerial等)作为参数传递给发送功能如下

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

从我刚才的问题我有一个getClasses函数返回一个Class[]并接受一个字符串参数。这用于提供不同的配置选项。

例如,我使用Class.forName("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); 
+0

'Comm com =(Comm)classComm;'这不工作吗?你应该有一个instanceof检查。 – Ankit

+0

@Ankit:我当然不会指望它! –

+0

您对“钻石语法”的评论没有多大意义 - 您没有使用钻石语法。 –

回答

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(); 

在这一点上,中投执行相应的检查。

+0

啊谢谢!你太棒了! – Armandt

+0

是的,你是对的。我只是测试它。 在此时抛出InstantiationException。 我相信这是因为我的类构造函数带参数?哈哈 http://docs.oracle.com/javase/6/docs/api/java/lang/InstantiationException.html – Armandt

+0

我做了一个测试。我为每个不带参数的'Comm'对象创建了构造函数。你的代码然后:)。我只需要弄清楚反射如何工作。 – Armandt