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

使用泛型类型执行强制转换时的警告

丰辰沛
2023-03-14
问题内容

我不明白为什么在尝试执行以下操作时会收到警告(未经检查的演员表):

...
Map<? estends SomeType, SomeOtherType> map;
...
Map<SomeType, SomeOtherType> castedMap = (Map<SomeType, SomeOtherType>) map;
...

我的意思是将castedMap发布到外部代码的危险是什么?两种操作均可在运行时完美运行:

  • 使用SomeType类型的键从castedMap获取元素
  • 使用SomeType类型的键将元素放入castedMap中。

我只是使用@SuppressWarnings(“ unchecked”)取消警告。


问题答案:

答案可能很无聊:出现警告时,它不是类型安全的。而已。

__在此示例中可以看到 为什么 它不是类型安全的:

import java.util.HashMap;
import java.util.Map;

class SomeType {}
class SomeSubType extends SomeType {}
class SomeOtherType {}

public class CastWarning
{
    public static void main(String[] args)
    {
        Map<SomeSubType, SomeOtherType> originalMap = new HashMap<SomeSubType, SomeOtherType>();
        Map<? extends SomeType, SomeOtherType> map = originalMap;
        Map<SomeType, SomeOtherType> castedMap = (Map<SomeType, SomeOtherType>) map;

        // Valid because of the cast: The information that the
        // key of the map is not "SomeType" but "SomeSubType"
        // has been cast away...
        SomeType someType = new SomeType();
        SomeOtherType someOtherType = new SomeOtherType();
        castedMap.put(someType, someOtherType);

        // Valid for itself, but causes a ClassCastException
        // due to the unchecked cast of the map
        SomeSubType someSubType = originalMap.keySet().iterator().next();
    }
}


 类似资料:
  • 我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?

  • 我有一个通用类。它看起来像这样: 显然,conevertdatajsonstring方法仅在字符串类型为T时调用。但有一个警告: 类型安全:未选中从字符串转换为T 有没有一种方法可以在不使用SuppressWarnings的情况下解决此问题: @抑制警告(“未选中”) 方法之前?

  • 强制类型转换 隐式类型转换:隐式类型转换又称为自动类型转换,隐式类型转换可分为三种:算术转换、赋值转换和输出转换。 显式类型转换:显式类型转换又称为强制类型转换,指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,这种类型转换可能会造成数据的精度丢失。 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则

  • 我有一个父类来处理我所有的自定义异常,父母异常。我希望所有的子异常都有一个方法来向异常添加消息。为了做到这一点,我创建了一个泛型方法,在向其添加消息后返回泛型类型的对象。我在父类方法中使用来添加消息,然后返回,但是由于该方法返回泛型类型,所以我将其转换为泛型类型T。这似乎是可行的,但是给出了警告。我的代码如下: 该行给出的警告是。这种方法似乎确实如预期的那样有效,所以我并不担心,但我想更好地理解为

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 有没有一种简单的方法可以做到这一点: 编辑:我写了一份正确答案的工作副本: