java - 从类类型转换为引用类

标签 java interface

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

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

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

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

我有各种类(ServerClientSerial 等),它们实现了 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/

相关文章:

java - 模拟系统类时的 Mockito + PowerMock LinkageError

java - TreeSet 算法交集的 BigO 复杂度是多少?

java - 是否可以在用户代码中使用 Java Unsafe?

go - 用作接口(interface)的复合文字的地址

java - 具有泛型方法参数、返回类型和接口(interface)的工厂

java - 在 Javascript 文件中获取 EL,由 @ResourceDependency 加载

java - url 模式和通配符

oop - 在哪里可以找到有关 OOP 的深入信息?

c++ - C++03 后期绑定(bind)接口(interface)的设计模式

c# - 使用 Activator.CreateInstance 后转换为正确的类型