热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

是否有一种干净的方法将泛型类型的类分配给变量?-IsthereacleanwaytoassigntheClassofagenerictypetoavariable?

Giventhiscode:鉴于这种代码:List<Integer>intsnewArrayList<Integer>();Typemismat

Given this code:

鉴于这种代码:

List ints = new ArrayList();

// Type mismatch: 
// cannot convert from Class to Class>       
Class> typeTry1 = ints.getClass(); 

// Type safety: 
// Unchecked cast from Class to Class>
Class> typeTry2 = (Class>) ints.getClass();

// List is a raw type. References to generic type List should be parameterized
Class typeTry3 = ints.getClass(); 

Is there a way to get the Class of a List without an error or warning? I can suppress the warnings easily enough, but if Java requires me to suppress a warning for this valid code, I am very disappoint.

是否有一种方法可以在没有错误或警告的情况下获得List 的类?我可以很容易地抑制警告,但是如果Java要求我为这个有效的代码抑制一个警告,我将非常失望。

On the other hand, if warning suppression is the only way, what is the safest to suppress?

另一方面,如果警告抑制是唯一的方法,那么最安全的抑制方法是什么?

2 个解决方案

#1


5  

This is a real Catch-22 in Java.

这是Java中真正的Catch-22。

The compiler warns you if you don't add a generic type to List:

如果不向列表中添加泛型类型,编译器会警告您:

// WARN: List is not typed
Class typeTry3 = ints.getClass();

That's because, in most cases, it's really best to type your Lists.

这是因为,在大多数情况下,最好键入列表。

However, because of type erasure, there's no way for Java to figure out the generic type of List at runtime, and the compiler knows that. Therefore, there is no method on Class that will returned a typed object:

但是,由于类型擦除,Java无法在运行时确定列表的泛型类型,编译器知道这一点。因此,在类上没有返回类型化对象的方法:

// ERROR: ints.getClass() doesn't return a Class>, it returns a Class
Class> var = ints.getClass();

So you must cast it to a typed list. However, as you know, since there is no runtime type checking, Java warns you about any casts to a typed variable:

因此,您必须将其转换为类型化列表。但是,正如您所知道的,由于没有运行时类型检查,Java警告您任何类型变量的类型转换:

// WARN: Casting to typed List
Class> typeTry2 = (Class>) ints.getClass();

Any attempt to get around this is essentially a means of confusing the compiler, and will inevitably be convoluted.

任何试图绕过它的尝试本质上都是一种混淆编译器的方法,并且不可避免地会令人费解。

Your best bet then is to go with Option B:

你最好的选择是选择B:

On the other hand, if warning suppression is the only way, what is the safest to suppress?

另一方面,如果警告抑制是唯一的方法,那么最安全的抑制方法是什么?

The safest way to suppress this warning is to make your @SuppressWarnings("unchecked") annotation as localized as possible. Put them above each individual unchecked cast. That way it's absolutely clear who's causing the warning.

抑制这个警告的最安全的方法是使您的@SuppressWarnings(“unchecked”)注释尽可能本地化。将它们放在每个未选中的cast上面。这样一来,谁会发出警告就一目了然了。

#2


3  

One way to do this would be to create your own class. I am not sure if this would meet your needs.

一种方法是创建自己的类。我不确定这是否能满足你的需要。

I am not really sure what you are trying to achieve. So perhaps wildcards is the answer.

我不太确定你想要达到的目标。所以也许通配符就是答案。

import java.util.*;

class Main
{
      public static void main(String[] args)
      {
            List list = new ArrayList();
            Class clazz = list.getClass();
            System.out.println(clazz) ;
      }
}

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
author-avatar
小群群zheng
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有