我有一个线程,根据系统的具体实现,为所需的资源加载不同的类.我的实现在Android上,我有一个类,它返回我的实现所需的特定类.我似乎能够很好地加载类,但是当我尝试将它分配给主线程中的对象时,它给了我一个ClassCastException.以下是片段:
在我的主线程中,我做:
try {
grammarProcessor = config.loadObject(GrammarProcessor.class);
Run Code Online (Sandbox Code Playgroud)
这给了我这个堆栈跟踪:
E/AndroidRuntime(6682): FATAL EXCEPTION: JVoiceXmlMain
E/AndroidRuntime(6682): java.lang.ClassCastException: org.jvoicexml.android.JVoiceXmlGrammarProcessor
E/AndroidRuntime(6682): at org.jvoicexml.JVoiceXmlMain.run(JVoiceXmlMain.java:321)
Run Code Online (Sandbox Code Playgroud)
GrammarProcessor是一个接口,JVoiceXmlGrammarProcessor是我加载和实现该接口的类.加载代码如下:
else if(baseClass == GrammarProcessor.class){
String packageName = "org.jvoicexml.android";
String className = "org.jvoicexml.android.JVoiceXmlGrammarProcessor";
String apkName = null;
Class<?> handler = null;
T b = null;
try {
PackageManager manager = callManagerContext.getPackageManager();
ApplicationInfo info= manager.getApplicationInfo(packageName, 0);
apkName= info.sourceDir;
} catch (NameNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return null;
}
PathClassLoader myClassLoader =
new dalvik.system.PathClassLoader(
apkName,
ClassLoader.getSystemClassLoader());
try …Run Code Online (Sandbox Code Playgroud) 语言:Java
编译器版本:1.6
在下面的代码中,我尝试执行以下操作:
List<String>StringList<String>到原始ListList<Integer>List给List<Integer>Integerget()@index 1和2 检索值并打印它们.所有语句都在编译(带警告)并运行正常.
但是,如果我尝试循环List<Integer>使用for循环,我会得到一个ClassCastException.我只是想知道为什么它允许我使用list.get()方法但不允许我迭代它?
输出:( 如果我使用未注释的for循环运行)abcd 200
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at genericsamples.CheckRawTypeAdd.main(CheckRawTypeAdd.java:26)
Run Code Online (Sandbox Code Playgroud)
这是我的代码
import java.util.*;
import java.io.*;
class CheckRawTypeAdd
{
public static void main(String[] sr)
{
List<String> list_str = new ArrayList<String>();
list_str.add("abcd");
List<Integer> list_int = new ArrayList<Integer>();
List list_raw;
list_raw=list_str;
list_int=list_raw;
list_int.add(200); …Run Code Online (Sandbox Code Playgroud) 我有一个java Web应用程序.我已经设置了这个新项目并在运行jsp时遇到以下异常,
Oct 10, 2012 3:01:49 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProcessor
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:151)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:340)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
Oct 10, 2012 3:01:57 AM org.apache.catalina.loader.WebappClassLoader modified
INFO: Additional JARs have been added : 'activation-1.1.jar'
Oct 10, 2012 3:01:57 AM org.apache.catalina.core.StandardContext reload
INFO: …Run Code Online (Sandbox Code Playgroud) I am getting a strange behavior, and I guess I'm more looking for an explanation than a solution (although solution is welcome as well!).
Here's the code:
PackageManager pm = context.getPackageManager();
List<PackageInfo> pkgList = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
if (pkgList == null)
return null;
for (PackageInfo pkgInfo : pkgList) {
ApplicationInfo appInfo = pkgInfo.applicationInfo;
// do some stuff, doesn't modify pkgInfo or appInfo or pkgList
}
Run Code Online (Sandbox Code Playgroud)
And on some occasions, I am getting error logs with:
java.lang.ClassCastException: cannot be cast to android.content.pm.PackageInfo
reported …
java android exception classcastexception android-package-managers
以下代码编译并成功运行,没有任何异常
import java.util.ArrayList;
class SuperSample {}
class Sample extends SuperSample {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
try {
ArrayList<Sample> sList = new ArrayList<Sample>();
Object o = sList;
ArrayList<SuperSample> ssList = (ArrayList<SuperSample>)o;
ssList.add(new SuperSample());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
不应该ArrayList<SuperSample> ssList = (ArrayList<SuperSample>)o;生产线ClassCastException?
虽然下面的代码产生编译时错误错误以防止堆污染,但上面提到的代码不应该在运行时进行类似的预防吗?
ArrayList<Sample> sList = new ArrayList<Sample>();
ArrayList<SuperSample> ssList = (ArrayList<SuperSample>) sList;
Run Code Online (Sandbox Code Playgroud)
编辑:
如果Type Erasure是这背后的原因,是否应该有其他机制来防止无效对象被添加到List?例如
String[] iArray = new String[5];
Object[] iObject = iArray;
iObject[0]= …Run Code Online (Sandbox Code Playgroud) 所以我正在玩geotools,我想我会代理他们的一个数据访问类,并跟踪它们在代码中的使用方式.
我编写了一个动态代理并在其中包含了一个FeatureSource(接口),并且很高兴.然后我想看看一些由featureSource返回,以及在传递对象,因为FeatureSource做的主要工作是返回的FeatureCollection(FeatureSource类似于一个SQL数据源,并以的FeatureCollection SQL语句).
在我的InvocationHandler我刚刚通过的调用底层对象,打印出目标类/方法/指定参数和结果,我去了,但是对于返回的FeatureCollection(另一个接口)调用,我裹着该对象在我的代理服务器(在相同的类,但一个新的实例,应该不重要吗?)并返回它.BAM!Classcast异常:
java.lang.ClassCastException: $Proxy5 cannot be cast to org.geotools.feature.FeatureCollection
at $Proxy4.getFeatures(Unknown Source)
at MyClass.myTestMethod(MyClass.java:295)
Run Code Online (Sandbox Code Playgroud)
调用代码:
FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = ... // create the FS
featureSource = (FeatureSource<SimpleFeatureType, SimpleFeature>) FeatureSourceProxy.newInstance(featureSource, features);
featureSource.getBounds();// ok
featureSource.getSupportedHints();// ok
DefaultQuery query1 = new DefaultQuery(DefaultQuery.ALL);
FeatureCollection<SimpleFeatureType, SimpleFeature> results = featureSource.getFeatures(query1); //<- explosion here
Run Code Online (Sandbox Code Playgroud)
代理人:
public class FeatureSourceProxy implements java.lang.reflect.InvocationHandler {
private Object target;
private List<SimpleFeature> features;
public static Object newInstance(Object obj, List<SimpleFeature> features) {
return java.lang.reflect.Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new FeatureSourceProxy(obj, features)
);
}
private …Run Code Online (Sandbox Code Playgroud) 我只是在玩MessageFormat但是当我尝试将String传递给MessageFormat 格式时,它编译得很好,但后来我得到了一个运行时的classcast异常.这是代码.
MessageFormat format = new MessageFormat("");
Object obj = Integer.toHexString(10);
format.format(obj);
现在我得到的运行时异常如下.
线程"main"中的异常java.lang.ClassCastException:java.lang.String无法强制转换为[Ljava.lang.Object; at java.text.MessageFormat.format(Unknown Source)at java.text.Format.format(Unknown Source)at JavaCore2.Codepoint.main(Codepoint.java:21)
我创建了一个名为MyDraw的自定义视图,这是我的MyDraw代码,
public class MyDraw extends View {
public MyDraw(Context context) {
super(context);
}
public MyDraw(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyDraw(Context context, AttributeSet attrs) {
super(context, attrs);
}
........................................
}
Run Code Online (Sandbox Code Playgroud)
我使用包名称在XML文件中添加了视图.它工作正常.现在我想在运行时为MyDraw设置高度和宽度,因为我使用了以下代码,
mMyDraw.setLayoutParams(new LayoutParams(220, 300));
Run Code Online (Sandbox Code Playgroud)
但我得到了例外,
java.lang.ClassCastException:android.view.ViewGroup $ LayoutParams
如何解决这个异常?请帮我..
我在我的挥杆应用程序中使用了Nimbus的外观和感觉.
有时,当显示对话框(使用dialog.setVisible(true))时,Nimbus外观会引发以下异常:
Caugth exception of type java.lang.ClassCastException with message javax.swing.plaf.nimbus.DerivedColor$UIResource cannot be cast to javax.swing.Painter
java.lang.ClassCastException: javax.swing.plaf.nimbus.DerivedColor$UIResource cannot be cast to javax.swing.Painter
at javax.swing.plaf.nimbus.NimbusStyle.getBackgroundPainter(NimbusStyle.java:708)
at javax.swing.plaf.nimbus.SynthPainterImpl.paintBackground(SynthPainterImpl.java:99)
at javax.swing.plaf.nimbus.SynthPainterImpl.paintPanelBackground(SynthPainterImpl.java:957)
at javax.swing.plaf.synth.SynthPanelUI.update(SynthPanelUI.java:155)
at javax.swing.JComponent.paintComponent(JComponent.java:778)
at javax.swing.JComponent.paint(JComponent.java:1054)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:155)
at …Run Code Online (Sandbox Code Playgroud) 当我创建一个自定义时View,在某些情况下我需要Context通过类的构造函数Activity强制转换类,为了使一些任务View直接在我的自定义View类中进行膨胀,我收到以下错误:
java.lang.ClassCastException: com.android.layoutlib.bridge.android.BridgeContext cannot be cast to android.app.Activity
Run Code Online (Sandbox Code Playgroud)
这是抛出此错误的行:
View headerView = ((Activity) context).getLayoutInflater().inflate(R.layout.fragment_history_list_header, null);
Run Code Online (Sandbox Code Playgroud)
看起来这个错误只发生在Eclipse试图膨胀要在XML编辑器中显示的视图时(不会在运行时发生).
有人知道如何解决它吗?
提前致谢.