gpt4 book ai didi

java - 在Java中如何正确地转换接口(interface)?

转载 作者:行者123 更新时间:2023-12-02 05:09:13 26 4
gpt4 key购买 nike

我正在学习使用 Rootbeer,但是当我运行它的示例应用程序时,我陷入了困境,并且没有人能够回答我的问题:Rootbeer runtime error, how to fix?

所以我下载了Rootbeer的源代码,并查看了代码,这里是问题所在[CUDAContext.java:119]:

          public void setKernel(Kernel kernelTemplate) {
this.kernelTemplate = kernelTemplate;
[ 119 ] this.compiledKernel = (CompiledKernel) kernelTemplate;
}

Kernel 和 CompiledKernel 的定义是:

public interface Kernel
{
public void gpuMethod();
}

public interface CompiledKernel
{
public String getCodeUnix();

public String getCodeWindows();

public int getNullPointerNumber();

public int getOutOfMemoryNumber();

public String getCubin32();

public int getCubin32Size();

public boolean getCubin32Error();

public String getCubin64();

public int getCubin64Size();

public boolean getCubin64Error();

public Serializer getSerializer(Memory memory,Memory memory1);

public boolean isUsingGarbageCollector();
}

第 119 行的转换是否正确?如果是,为什么我收到错误消息:

java.lang.ClassCastException: ArrayMult cannot be cast to org.trifort.rootbeer.runtime.CompiledKernel
at org.trifort.rootbeer.runtime.CUDAContext.setKernel(CUDAContext.java:119)

如果没有正确完成,正确的转换方法是什么?

编辑:这是示例代码

import java.util.List;
import java.util.ArrayList;
import org.trifort.rootbeer.runtime.Kernel;
import org.trifort.rootbeer.runtime.Rootbeer;

public class ArrayMultApp
{
public ArrayMultApp()
{
int[] array=new int[10];
for (int i=0;i<array.length;++i) array[i]=i;
for (int i=0;i<array.length;++i) Out("start array["+i+"]: "+array[i]);
multArray(array);
for (int i=0;i<array.length;++i) Out("final array["+i+"]: "+array[i]);
}

public void multArray(int[] array)
{
try
{
List<Kernel> jobs=new ArrayList();
for (int i=0;i<array.length;++i) jobs.add(new ArrayMult(array,i));
Rootbeer rootbeer=new Rootbeer();
rootbeer.run(jobs);
}
catch (Exception e) { e.printStackTrace(); }
}

public static void main(String[] args) { ArrayMultApp app=new ArrayMultApp(); }

private static void out(String message) { System.out.print(message); }

private static void Out(String message) { System.out.println(message); }
}

class ArrayMult implements Kernel
{
private int[] m_source;
private int m_index;

public ArrayMult(int[] source,int index)
{
m_source=source;
m_index=index;
}

public void gpuMethod() { m_source[m_index]*=11; }
}

最佳答案

不,不是。您有两个不同的界面。

     public void setKernel(Kernel kernelTemplate) {
this.kernelTemplate = kernelTemplate;
[ 119 ] this.compiledKernel = (CompiledKernel) kernelTemplate;
}

在 119 上,您尝试将 Kernel 转换为 CompiledKernel,每个内核都有自己的层次结构。如果CompiledKernel扩展了Kernel,那么这将起作用。

关于java - 在Java中如何正确地转换接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27471330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com