首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我可以用字符串字面值创建一个对象,但是如果泛型出现了,我就不能?

在Java中,字符串字面值可以被用作创建String对象的一种简便方式。这是因为Java编译器对字符串字面值进行了特殊处理,将其自动转换为String对象。例如,当我们使用以下代码创建一个String对象时:

String str = "Hello World";

编译器会将字符串字面值"Hello World"转换为一个String对象,并将其赋值给变量str。

然而,当涉及到泛型时,情况会有所不同。泛型是Java中的一种强大的特性,它允许我们在编译时指定一种类型,并在运行时使用该类型。泛型的类型参数必须是一个具体的类型,而不能是一个对象。

例如,我们无法使用以下代码创建一个泛型对象:

T obj = new T(); // 错误的代码

这是因为在编译时,泛型类型参数T被擦除为Object类型,而Object类型不能直接实例化。

因此,当涉及到泛型时,我们不能使用字符串字面值创建一个泛型对象。相反,我们需要使用泛型的构造函数或工厂方法来创建泛型对象。例如:

T obj = new T(); // 错误的代码

可以替换为:

T obj = new T(); // 使用泛型的构造函数或工厂方法创建对象

总结起来,字符串字面值可以被用作创建String对象的一种简便方式,但在涉及到泛型时,我们需要使用泛型的构造函数或工厂方法来创建泛型对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JS数据类型_JS数据类型之引用数据类型

ES6 中新增了一种 Symbol 。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。 谷歌67版本中还出现了一种 bigInt。是指安全存储、操作大整数。...(但是很多人不把这个做为一个类型)。 JS数据类型:JS 的数据类型有几种? 8种。...期间我一直在纠结 Number(‘as’) 输出 NaN ?NaN == NaN 为什么是 false。其实 js 规定的NaN 不等于NaN。...简单理解就是:undefined 是没有定义的,null 是定义了但是为空。 JS数据类型:null 不存在的原因是什么?如何解决?...字符串是不可变的,一旦创建,值就不能改变 要改变某个变量保存的字符串,首先要销毁原来的字符串,然后于用另一个包含的字符串填充该变量。

5.9K31

Java基础扫盲(二)

",所以他们会指向字符串池中的同一个字符串对象: 但是,之所以可以这么做,主要是因为字符串的不变性,如果字符串是可变的,我们一旦修改了s的内容,那必然导致s2的内容也被动的改变了。...当我们在程序中传递一个字符串的时候,如果这个字符串的内容是不可变的,那么我们就可以相信这个字符串中的内容。 但是,如果是可变的,那么这个字符串内容就可能随时都被修改。那么这个字符串内容就完全不可信了。...这就是Java 9引入了"Compact String"的概念:每当我们创建一个字符串时,如果它的所有字符都可以用单个字节(Latin-1)表示,那么将会在内部使用字节数组来保存一半所需的空间,但是如果有一个字符需要超过...Object – 是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换...这意味着一旦一个 String 对象被创建,其内容就不能被改变。任何看似修改了 String 值的操作实际上都是创建了一个新的 String 对象。

9110
  • 《Kotlin 程序设计》第三章 Kotlin 类型系统第三章 Kotlin 类型系统基本数据类型2.字符类型CharKotlin类型系统参考资料

    但是引用地址不同。 1.3字面常量 在Kotlin的数字常量可以用十进制、十六进制、指数形式小数、二进制但是没有八进制。...可以用 foreach 循环迭代字符串: for (c in str) { println(c) } 字符串字面值 Kotlin 有两种类型的字符串字面值: 转义字符串可以有转义字符,以及原生字符串可以包含换行和任意文本...如果你需要在原生字符串中表示字面值 $ 字符(它不支持反斜杠转义),你可以用下列语法: val price = """ ${'$'}9.99 """ Kotlin类型系统 Kotlin有一个统一的类型系统...但是Kotlin中一个都没有,取而代之的是两种其他实现:: declaration-site协变 类型预测(type projections) 首先,让我们想一下,为什么Java需要如此难以理解的通配符...如果类型名称太长,你可以另外引入较短的名称,并使用新的名称替代原类型名。 它有助于缩短较长的泛型类型。

    1.4K30

    如何通俗易懂地理解什么叫泛型?

    这个时候编译是不会报错的,因为集合本来就可以存放多种数据类型,但是我以为只有名字,也就是字符串。 ? ①在Collection集合中添加一个String类型的数据。...③现在我想统计群里人名都是多少字的,我以为只有字符串,就会将其强转成String并调用String的lenth方法。...但是不能一篇作文既写成记叙文又写成议论文。 一旦你确定了题材(比如说写议论文),那么这篇作文就不能写其他题材了(只能写议论文)想写其他题材,那下一篇作文重新写。 所以什么叫泛型?...②泛型类的使用 在创建对象的时候确定泛型,指定好了后这个对象就只能装指定的数据类型了。 如果要换其他数据类型,就要重新创建该类的对象,重新指定泛型。泛型类有何好处?...③ArrayList的add方法 add方法参数就是一个泛型,也就是说创建对象时确定的是哪个类型,使用add方法就只能添加这个类型了,这就起到了一个千变万化的效果。 2泛型接口 ?

    96930

    《JavaSE-第二章》之基本数据类型与类型转换

    scanf那么坑,之前我使用scanf多打了一个空格结果啥都出不来。...,String类定义的变量可以用于指向字符串对象,然后操作该字符串。...⚫ Java 程序中的所有字符串文字(例如“abc”)都为此类的对象。 特点 ⚫ String其实常被称为不可变字符串类型,它的对象在创建后不能被更改。...强制类型转换如同将大瓶子中的水倒入到小瓶子里最终瓶子虽然也装满水了,但是会造成溢出部分水(数据的缺失);隐式转换如同小瓶子中的水倒入到大瓶子里。...b = a; java是强类型语言,会对变量的字面值进行检查,如果字面值大于某一类型存储的最大值的话是无法编译的体现在idea中就是有一条红色的波浪线。

    20941

    《编写高质量代码》学习笔记(2)

    Constant Pool或String Literal Pool),在字符串池中容纳的都是String字符串对象,它的创建机制是这样的:创建一个字符串时,首先检查池中是否有字面值相等的字符串,如果有...对于此例子来说,就是创建第一个"詹姆斯"字符串时,先检查字符串池中有没有该对象,发现没有,于是就创建了"詹姆斯"这个字符串并放到池中,待创建str2字符串时,由于池中已经有了该字符串,于是就直接返回了该对象的引用...那为什么intern方法处理后即又相等了呢?因为intern会检查当前对象在对象池中是否存在字面值相同的引用对象,如果有则返回池中的对象,如果没有则放置到对象池中,并返回当前对象。...String类是不可变的量,也就是创建后就不能再修改了,比如创建了一个"abc"这样的字符串对象,那么它在内存中永远都会是"abc"这样具有固定表面值的一个对象,不能被修改,即使想通过String提供的方法来尝试修改...,也就是说一个泛型类和一个普通类在经过编译后都指向了同一字节码,比如Foo类,经过编译后将只有一份Foo.class类,不管是Foo还是Foo引用的都是同一字节码

    1.7K40

    常量与变量

    字符串就是双引号""的内容叫做字符串,包含类似于字符常量的字符:普通的字符,转义序列和通用的字符。  ---- 转义字符 当然如果你觉得这个字符比较长的话其实也可以用空格符分开来,进行分析!...,我们这里PAL左边变量被const所给修饰的量,左值指定了const的对象,所以它是不能被修改的值。...那么为什么叫常变量呢?因为它具有常属性—常属性就是不能被改变的属性,但是其实它的本质上还是变量!举个例子给大家看下:所以还是叫做常变量!...变量的定义 变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。 变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表。...数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句: int age = 17; 但是下面的这个就是错误的,会生成编译器上的错误!

    71920

    初探 TypeScript函数基本类型泛型接口类内置对象

    JavaScript 会报错,此时 this 指向了 window,但是TypeScript 不会报错,他指定了 this 会在哪个对象上面调用 基本类型 ?...是数组的索引类型,: 后面表示是一个数字组成的数组(这样表述好像还有点怪,欢迎指正) 元组 Tuple 元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同(数组合并了相同类型的对象,而元组合并了不同类型的对象...在软件工程中,我们不仅要创建一致定义良好的 API,同时也要考虑可重用性,组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能 用泛型来创建可重用的组件...let myIdentity1:{ (arg:T):T} = identity 复制代码 可以使用带有调用签名的对象字面量来定义泛型函数,我们可以将对象字面量拿出来作为一个接口,将一个泛型参数当做整个接口的一个参数...如果你有相关的开发经验,想像你学习,交流哈哈,需要一个老司机带我哈哈

    7.3K31

    Kotlin中的函数

    函数还可以用中缀表示法调用,当他们是成员函数或扩展函数,只有一个参数,用 infix关键字标注 // 给 Int 定义扩展 infix fun Int.shl(x: Int): Int { …… } /...例子如下: 在Android开发中,打印信息 //通过关键字inline来定义内联函数。 //泛型中的 reified关键字告诉编译器,这个泛型是可以具体拿到值的泛型。...可以实现dsl风格的代码全靠它 Kotlin 提供了使用指定的 接收者对象 调用函数字面值的功能。 可以调用该接收者对象上的方法而无需任何额外的限定符,可以任意调用接受者的方法和属性。...(other: Int) -> Int //该函数字面值可以这样调用,就像它是接收者对象上的一个方法一样: 1.sum(2) 上面那段还是有点不大理解 匿名函数语法允许你直接指定函数字面值的接收者类型...当接收者类型可以从上下文推断时,lambda 表达式可以用作带接收者的函数字面值。 推断上下文是什么意思?

    2.3K40

    BATJ面试必会之常见Java基础面试题(附答案)

    根据你对这个泛型问题的回答情况,你会得到一些后续提问,比如为什么泛型是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误泛型代码。请阅读我的Java中泛型是如何工作的来了解更多信息。...泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。另一方面表示了非限定通配符,因为可以用任意类型来替代。更多信息请参阅我的文章泛型中限定通配符和非限定通配符之间的区别。...在本段出现的连接中可以找到更多信息。 (5)如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?...对任何一个不太熟悉泛型的人来说,这个Java泛型题目看起来令人疑惑,因为乍看起来String是一种Object,所以List应当可以用在需要List的地方,但是事实并非如此。...这可能是Java泛型面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持泛型,这也是为什么Joshua Bloch在Effective Java一书中建议使用List来代替Array,因为

    89920

    C# 7.0简而言之 -- 02. C#基础 (1)

    预定义类型 int就是一个预定义类型, 它是整数类字面值的默认类型, 如果这个字面值不超过int的上下限的话....而new操作符可以创建一个自定义类型的实例: UnitConverter feetToInchesConverter = new UnitConverter (12); 在使用new操作符初始化对象之后...: 值类型 引用类型 泛型类型参数 指针类型 值类型包扩大多数内置的类型(所有的数值类型, char, bool), 还包括自定义的struct和enum(枚举)类型....下例中, 如果Point是类而不是struct: [image.png] [p1, p2是指向同一个对象的两个引用] Null 一个引用可以被赋值为null, 表示该应用没有指向任何一个对象: [image.png...= '\u00A9'; char的转型 char可以隐式的转换为数值型, 但是要求该数值型至少可以容纳.无符号short的大小.

    1K120

    关于JS字面量及其容易忽略的12个小问题

    var n16 = 0x11 console.log(n16) //17 var n17 = 0xw console.log(n17) //报错 二进制 二进制字面值的前两位必须是0b,如果出现除0、1...String()重新创建了一个新对象,所以调用方法可以,调用类似于方法的属性(例如length)也可以,但是使用动态属性不可以,因为在内存堆里已经不是同一个对象了。...想象这个场景可能是这样的: 程序员通过字面量创建了一个字符串对象,并把一个包裹交给了他,说:“拿好了,一会交给我”。...例如: let message = `Hello world` //使用模板字符串字面量创建了一个字符串 使用模板字符串,原来需要转义的特殊字符例如单引号、双引号,都不需要转义了: console.log...JS的字面量对象,是一种简化的创建对象的方式,和用构造函数创建对象一样存在于堆内存当中。对象字面值是封闭在花括号对({})中的一个对象的零个或多个"属性名-值"对的元素列表。

    3.1K20

    【笔记】《深入理解C++11》(上)

    , 如果定义了常量左值引用构造也能正确执行, 只不过会变为拷贝形式 常量右值引用存在但是没有实际用途 std::move()能强制使一个左值变为右值, 但是不会改变其生命周期 右值引用本身是个左值,...新增ReturnType operator "" X(Args)作为后缀操作符, 其允许我们将字符串字面值加上自定义的后缀X来转换为目标字面类型 但是对于这个操作符的编写有相关的参数限制: 字面值是整型...或字符串 字面值是字符串, 参数是字符串和size_t标识处这个const char*的长度 字面值是字符, 参数只能是单个字符 为了避免和内置的字面值后缀混淆, 后缀名最好以下划线开头 Plain Old..., 所以不会降低效率 标准库中的std::result_of()内部的type命名本质就是decltype decltype有所谓的推导四原则: 如果目标是一个没有带括号的标记符表达式(也就是除去关键字...也就是decltype一个const对象时, 尽管对象本身的const类型能被获取, 但是从这个对象中取出成员的const会丢失 5 提高类型安全 强类型枚举 普通的枚举enum代表对应到整数值的一些名字

    2K20

    精选Java基础面试120题

    类中的成员需要私有的时候使用private关键字 特点:是一个权限修饰符。可以修饰成员(成员变量和成员方法) 被private修饰的成员只在本类中才能访问 2.13 为什么要有 this 关键字?...this 关键字的含义? this用来解决成员变量与局部变量重名问题 this关键字代表的是本类对象引用;谁调用我,this就代表谁. 2.14 final 关键字是什么意思,可以修饰那些成员?...也被称为参数化类型,可以把类型当做参数一样传递过来,在传递过来之前我不明确,但是在使用的时候就就明确了。...泛型的好处 提高了程序的安全性 将运行期遇到的问题转移到了编译期 省去了类型强转的麻烦 泛型的常见应用 泛型类 泛型方法 泛型接口 2.21 如何编写一个泛型方法,让它能够接受泛型参数并返回泛型类型?...5个对象 a b c ab abc 因为字符串的特点是一旦被创建就不能被改变,所有在使用常量进行相加的时候,都是在创建新的字符串对象,最后在把字符串"abc"这个常量值赋值给引用变量s 4.2 如何实现

    78720

    java中的强迫症患者

    但是理想很丰满,现实很骨感,如果对于一个集合添加的元素没有约束,可以随意往一个集合里面放任何类型的对象,会发生意想不到的问题。 为什么有泛型 ? 双十一你剁手了没?...我放进去的明明就是一个商品类型Commodity呀,为什么拿出来的时候变成Object了?...泛型是什么 没有泛型的时候,集合就是个强迫症患者,什么强迫症?元素类型不统一就不能清空购物车,不能清空购物车就浑身难受,心浮气躁,上蹿下跳。而泛型的出现,恰恰治好了集合的强迫症。...泛型的语法变化 在java5的时候,有了泛型治好了集合的强迫症,List,Set,Map等集合都可以使用泛型来规范元素的类型。但是有个缺点就是写起来太啰嗦了。...在java7之前,不好意思,你还真得老老实实写一遍,但是java7的出现,可以让我们偷偷懒了。不需要在实现的时候再写一遍泛型类型。

    55740

    Java 学习笔记(1)——java基础语法

    但是万事逃不过真香定律,在工作之后,慢慢接触了Java,也了解了java,其实Java并不像我想想的那么简单。但是我心里一直抗拒学它。...答案是不行的,由于main函数是一个入口函数,一切都从它开始,如果它是一个类函数,那么势必要定义一个类的对象然后再调用对象的main方法,可是既然main是程序的开始,请问如何在调用main之前定义对象呢...在Java中一切即对象,它强制你采用面向对象,这也是当时我拒绝学java的一个理由,认为它太死板。...常量与变量 常量在java中一般是指那种用字面值表示出来的量比如说 整型的1,浮点型的1.234, 字符 'A' 字符串 'hello world',或者是用关键字 const 定义的。...java中的char占两个字节,所以在C/C++中会将需要一个字节一个字节处理的缓冲定义为char型数组,而在java中就不能这么干了,因为它的char占两个字节,java中对于这种情况一般是定义为byte

    49720

    TypeScript进阶 之 重难点梳理

    「但是为什么我都会写 ts 了,却看不懂别人的代码呢?」 这!就是入门与进阶之隔。也是本文的目的所在。...如果不指定类型,就在定义的之后指定一个默认的类型 myLog(1) 「我们也可以把泛型变量理解为函数的参数,只不过是另一个维度的参数,是代表类型而不是代表值的参数。」...而 T[K]就是去对象的 T 下的key: K的 value infer infer 关键字最早出现在 PR 里面,「表示在 extends 条件语句中待推断的类型变量」 是在 ts2.8 引入的,在条件判断语句中...由于 keyof 关键字已经介绍了。其实就是可以用来取得一个对象接口的所有 key 值。...为什么我不能判断类型或者可选参数呢?

    3.9K20

    .NET深入解析LINQ框架(一:LINQ优雅的前奏)

    按照常理说我在泛型方法的形参里面定义一个泛型的委托,他们的形参类型都是一样的占位符,但是如果我使用带有形参的方法作为委托的参数的话是无法进行类型推断的,然后使用无参数的方法作为委托参数是完全没有问题的。...但是如果我使用GetOrderListByModel作为GetModelList(Func GetFunc)重载版本的泛型方法时就不能真确的推断出类型...小结:按照这个分析,似乎对于方法的泛型类型推断只限于Lambda表达式?如果不是为什么多了参数就无法进行类型推断?...而如果我们使用字符串的方式来表达逻辑的结构,那么我们只能在运行时才能知道它的正确性,这样的正确性是很脆弱的,不知道在什么样的情况下会出现问题。...什么叫整体的表达式,就是说完全可以用一个表达式对象来表示它,这里就是我们的LambdaExpression对象。

    1.9K31

    Swift基础语法(三)

    执行打印结果为: 我想吃? 给你吃? 值类型在实例方法中修改属性和调用方法 值类型(比如结构体)默认情况下不能在实例方法中修改属性,但是我们可以在函数前面放一个mutating关键字来实现。...,这些方法仅仅是参数的类型不同,是不是针对每一个类型都需要写一个转换方法呢? 此时就需要用到泛型了。...协议中使用泛型,是通过 associatedtype 关键字。...,是通过关键字 associatedtype 来实现的 与类、结构体或者枚举中的泛型一样,协议中的泛型也可以进行类型约束(通过继承或者遵循协议的方式) 异常 如何来描述一个异常 在Swift中,任何一个遵从...方式,该方式不处理异常,如果出现了异常,则会返回一个nil;没有出现异常则正常返回。 // 最终返回结果为一个可选类型 let result = try?

    2.1K40
    领券