Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从类类型转换为引用类_Java_Interface - Fatal编程技术网

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