在泛型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: <T>
应该是class Option<T>
@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:)
方法来识别type
的object
。
print(type(of: option1.data)) //ABC
print(type(of: option2.data)) //XYZ
您可以在ABC
和XYZ
中使用protocol
访问title
。
使ABC
和XYZ
符合protocol PPP
并在ABC
和XYZ
中实现其title
属性。
print(option1.data?.title)
print(option2.data?.title)
【讨论】:
感谢您的回答。但我需要确定最后一行中数据的数据类型。如果没有类型转换,我该怎么做? 这是正确的,我已经知道了。我正在寻找类似的东西: option1.data.title 我可以直接访问变量而不检查其类型吗?我想这可以使用协议来完成? 也更新了。试一试。 谢谢。这是一个很好的帮助。这是否意味着我必须在 PPP 协议中声明类 ABC() 和 XYZ() 的所有变量? 没有。但反过来是true
。您需要在ABC
和XYZ
中实现PPP
的强制variables
和methods
。以上是关于在泛型Integer输入String的主要内容,如果未能解决你的问题,请参考以下文章
如何在泛型中实现 TCollection 和 TCollectionItem 功能