当前位置: 首页 > 面试题库 >

调用“ Class.forName”时未选中的投射警告

柯奕
2023-03-14
问题内容

我的代码如下

package com.foo;

public class TestComposition {
    public static void main(String[] args) {
        try {
            Class<Foo> fooClass = 
                    (Class<Foo>) Class.forName("Foo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

“ try”块中的分配会导致警告说明

Type safety: Unchecked cast from Class<capture#1-of ?> to 
     Class<Foo>

为什么是这样?


问题答案:

好吧,首先让我们弄清楚问题出在哪里-它在演员表中。这是一个简短的示例

public class Test {    
    public static void main(String[] args) throws Exception {
        Object x = (Class<Test>) Class.forName("Test");
    }
}

这仍然有同样的问题。问题在于强制Class类型转换实际上不会测试任何东西-
因为强制类型转换将有效地转换为原始类型。因为Class<T>这有点让人惊讶,因为实际上对象 确实 知道所涉及的类,但是考虑类似的情况:

List<?> list = ... get list from somewhere;
List<String> stringList = (List<String>) list;

该类型转换将不会检查它是否 确实 是a List<String>,因为该信息会由于 类型擦除 而丢失。

现在以您的情况为例,实际上有一个更简单的解决方案-如果您仍然在编译时知道类名,则只需使用:

Class<Foo> fooClass = Foo.class;

如果您可以提供一个更实际的示例(实际情况 并非 如此),我们可以帮助您确定最合适的替代方法。



 类似资料:
  • 我在应用程序启动时从数据库中检索一些默认值,并使用它来设置活动中微调器项的选定值。 代码工作正常,但问题是我在Android Studio中收到一个警告,警告对a.getPosition调用中作为原始类型“android.widget.ArrayAdapter”成员的“getposition(T)”的未检查调用。 我很高兴它的工作,但新的Android和Java我想了解和消除尽可能多的警告,从我的

  • 问题内容: 令人反感的代码 错误: 不确定这样的错误需要多少信息。 问题答案: 问题在于上面的代码没有使用泛型。 以下将起作用: (如果为,则为要保存的元素的type参数)内部的类型名称告诉编译器应期望的对象类型。 如果尝试添加一个指定类型的对象(例如,在这种情况下,尝试添加和),则会发生编译时错误,这表明正在使用一种非预期类型的​​对象添加。 就是说,应该尽量不要使用该类。为了更多的目的,例如从

  • 该脚本引用了slider(滑块)gameobject(游戏对象),并具有一个协同例程(Coroutine),当我们通过按a键将光线投射到画布上时,该脚本将填充滑块。我的代码工作正常,但它不能正确填充滑块。它可以在光线投射时立即改变场景。我想要的是第一个滑块是fill,音频是play,而滑块值等于0。而不是场景更改。我想我在协同程序中做错了什么。 代码: RayCast脚本: 滑块选择脚本:

  • 问题内容: 实例化ArrayAdapter时,我收到以下警告(编译正常): 这是问题所在: 有人对它为什么给我这个警告有任何想法吗? 问题答案: 这是因为希望您指定它将处理的对象类型。因此,为了避免这些警告,请执行以下操作:

  • java.io.ioException:映射项中的类型不匹配:应为org.apache.hadoop.io.text,已收到org.apache.hadoop.mapred.maptask$MapOutputBuffer.Collect(Maptask.java:870)在org.apache.hadoop.mapred.maptask$NewOutputCollector.Write(Mapta

  • 奇怪的情况-下面是代码: 构建项目时(在项目属性中使用编译器选项Xlint:unchecked),我得到一个警告: 警告:[未选中]未选中的强制转换 ArrayList list=(ArrayList)obj[1]; 必需:ArrayList 找到:对象 但用同样的方法来浇铸字符串是可以的。这里有什么问题?