Java 从类类型转换为引用类
这个问题的背景可以从我前面的问题中找到 上一个问题: 我有一个带有发送功能的接口Java 从类类型转换为引用类,java,interface,Java,Interface,这个问题的背景可以从我前面的问题中找到 上一个问题: 我有一个带有发送功能的接口Comm: public interface Comm { public int send(Socket socket, byte[] bytes); } 我有各种类(服务器,客户端,串行,等等),它们实现了接口通信。我可以将这些类对象作为参数传递给另一个类中的另一个发送函数,该函数充当Comm对象和各种插件之间的管理器,这些插件可配置为使用其中一个Comm类作为通信介质 (服务器、客户端、串行等)可以作为
Comm
:
public interface Comm
{
public int send(Socket socket, byte[] bytes);
}
我有各种类(服务器
,客户端
,串行
,等等),它们实现了接口通信
。我可以将这些类对象作为参数传递给另一个类中的另一个发送函数,该函数充当Comm
对象和各种插件之间的管理器,这些插件可配置为使用其中一个Comm
类作为通信介质
(服务器
、客户端
、串行
等)可以作为参数传递给下面的发送功能
public void Send(Comm com, Socket socket, byte[] message)
{
com.send(null, message);
}
从上一个问题开始,我有一个getClasses
函数,它返回一个Class[]
,并将字符串作为参数。这用于提供不同的配置选项
我使用Class.forName(“客户机”)
例如,为客户端返回类
对象
现在我的问题是:
如何从Class
转换为Comm
类型?为了让您了解我的想法,我做了以下尝试:(cboxComm
是用于测试我的代码的测试组合框。它包含Comm
对象的类名)
//一些代码我不知道它是如何工作的,一个解释会很棒
//关于钻石语法
类不能从类
对象转换为类的实例。您需要创建一个实例,例如,使用以下方法:
注意,这需要类中有一个公共的无参数构造函数。在代码中总是这样吗?如果没有,您将需要获取适当的构造函数并使用反射调用它,这将变得更加复杂
顺便说一句,我很惊讶这对你有任何作用:
Class<? extends Comm> classComm = Class.forName(...);
此时,强制转换将执行相应的检查。您不能从类
对象转换为该类的实例。您需要创建一个实例,例如,使用以下方法:
注意,这需要类中有一个公共的无参数构造函数。在代码中总是这样吗?如果没有,您将需要获取适当的构造函数并使用反射调用它,这将变得更加复杂
顺便说一句,我很惊讶这对你有任何作用:
Class<? extends Comm> classComm = Class.forName(...);
此时,cast将执行适当的检查。Comm com=(Comm)classComm代码>这不管用吗?不过你应该有一个支票的实例。@Ankit:我当然没想到会有!你关于“钻石语法”的评论没有多大意义-你没有使用钻石语法。@JonSkeet:我的错,没有注意到。我对java不是很熟悉,我的意思是使用Comm-com=(Comm)classComm代码>这不管用吗?不过你应该有一个支票的实例。@Ankit:我当然没想到会有!你关于“钻石语法”的评论没有多大意义-你没有使用钻石语法。@JonSkeet:我的错,没有注意到。更新您的答案:)@JonSkeet:我对java不是很熟悉,我的意思是使用Yes,您是对的。我刚测试过。此时将抛出实例化异常。我相信这是因为我的类构造函数接受参数?哈哈,我做了个测试。我为每个不带参数的Comm
对象创建了构造函数。您的代码可以工作:)。我只需要弄清楚这种反射是如何工作的。是的,你是对的。我刚测试过。此时将抛出实例化异常。我相信这是因为我的类构造函数接受参数?哈哈,我做了个测试。我为每个不带参数的Comm
对象创建了构造函数。您的代码可以工作:)。我只需要弄清楚这种反射是如何工作的。
Class<? extends Comm> classComm = Class.forName(...);
Class<?> classComm = Class.forName();
Comm comm = (Comm) classComm.newInstance();