在泛型Integer输入String

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在泛型Integer输入String相关的知识,希望对你有一定的参考价值。

这是怎么回事呢??

理论解释如楼上所说。

也可以用javap -c反汇编这个class出来看看:

public static void append(java.util.List);
  Code:
   0:   aload_0
   1:   ldc     #16; //String 0042
   3:   invokeinterface #18,  2; //InterfaceMethod java/util/List.add:(Ljava/lan
g/Object;)Z
   8:   pop
   9:   return

public static void main(java.lang.String[]);
  Code:
   0:   new     #28; //class java/util/ArrayList
   3:   dup
   4:   invokespecial   #30; //Method java/util/ArrayList."<init>":()V
   7:   astore_1
   8:   aload_1
   9:   invokestatic    #31; //Method append:(Ljava/util/List;)V
   12:  getstatic       #33; //Field java/lang/System.out:Ljava/io/PrintStream;
   15:  aload_1
   16:  iconst_0
   17:  invokeinterface #39,  2; //InterfaceMethod java/util/List.get:(I)Ljava/l
ang/Object;
   22:  invokevirtual   #43; //Method java/io/PrintStream.println:(Ljava/lang/Ob
ject;)V
   25:  return
   
   
   append中的list.add("0042")对应的是3:   invokeinterface #18,  2; //InterfaceMethod java/util/List.add:(Ljava/lan
g/Object;)Z,可以看到List.add的是Object,并没有强制类型转换。
System.out.println(intList.get(0))对应的是17:  invokeinterface #39,  2; //InterfaceMethod java/util/List.get:(I)Ljava/l
ang/Object;
   22:  invokevirtual   #43; //Method java/io/PrintStream.println:(Ljava/lang/Ob
ject;)V,可以看到List.get的Object,并没有进行类型检测(checkcast)。。。所以结果就这样了。。

参考技术A Java的泛型是采用擦拭法的,也就是说Java泛型是一个假的泛型,仅仅是作为编译期的检查,运行期间泛型被擦除,所以产生String型数据可以插入到声明为Integer类型的List中,而且不会将String型强转为Integer。但你此时却不能运行Integer i = intList.get(0);这会产生Class匹配不上的异常本回答被提问者和网友采纳

在泛型类中传递泛型参数

【中文标题】在泛型类中传递泛型参数【英文标题】:Passing generic parameters in a generic class 【发布时间】:2019-05-21 17:00:26 【问题描述】:

是否有可能在 swift 中使用泛型得到类似下面的东西?任何帮助都将比其他任何事情都更重要。

class ABC 
   var title: String?


class Option: <T> 
   var name: String?
   var data: T?


let object1 = ABC()

let option = Option(name: "Test", data: object1)

// Getting data again
let data = option.data

【问题讨论】:

class Option: &lt;T&gt; 应该是class Option&lt;T&gt; @Sh_Khan:我期待的答案不在您标记为重复的示例中。事实上,下面的答案是我需要的。你能删除重复的标签吗? 【参考方案1】:

以下是在Swift 中使用Generics的方法。

protocol PPP 
    var title: String? get set


class ABC: PPP 
    var title: String?


class XYZ: PPP 
    var title: String?


class Option<T> 
    var name: String?
    var data: T?

    init(name: String?, data: T?) 
        self.name = name
        self.data = data
    


let object1 = ABC()
let option1 = Option(name: "Test1", data: object1)

let object2 = XYZ()
let option2 = Option(name: "Test2", data: object2)

由于Swift 中的classes 没有default initializer,因此创建一个接受2 个参数的String?T?

您可以使用type(of:) 方法来识别typeobject

print(type(of: option1.data)) //ABC
print(type(of: option2.data)) //XYZ

您可以在ABCXYZ 中使用protocol 访问title

使ABCXYZ 符合protocol PPP 并在ABCXYZ 中实现其title 属性。

print(option1.data?.title)
print(option2.data?.title)

【讨论】:

感谢您的回答。但我需要确定最后一行中数据的数据类型。如果没有类型转换,我该怎么做? 这是正确的,我已经知道了。我正在寻找类似的东西: option1.data.title 我可以直接访问变量而不检查其类型吗?我想这可以使用协议来完成? 也更新了。试一试。 谢谢。这是一个很好的帮助。这是否意味着我必须在 PPP 协议中声明类 ABC() 和 XYZ() 的所有变量? 没有。但反过来是true。您需要在ABCXYZ 中实现PPP 的强制variablesmethods

以上是关于在泛型Integer输入String的主要内容,如果未能解决你的问题,请参考以下文章

为啥在泛型上使用 InstanceType 是错误的

在泛型类中传递泛型参数

如何在泛型中实现 TCollection 和 TCollectionItem 功能

在泛型接口中推断变量类型

涉及泛型对象的泛型属性的赋值无法在泛型函数中正确进行类型检查

在泛型方法中返回原始集合类型