首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java --如何处理构造函数中的类型擦除?

Java --如何处理构造函数中的类型擦除?
EN

Stack Overflow用户
提问于 2012-06-07 18:41:43
回答 5查看 4.4K关注 0票数 19

假设我的类中有两个构造函数:

代码语言:javascript
运行
AI代码解释
复制
public User (List<Source1> source){
...
}

public User (List<Source2> source) {
...
}

假设这两个构造函数都提供了关于用户的相同信息,并且都是为不同用例构造用户的同样有效的方法。

在Java语言中,由于类型擦除,您无法做到这一点-- Java不会接受两个参数为List<?>的构造函数。

那么,解决这个问题的方法是什么呢?什么是不过分杀伤力,但仍然尊重基本面向对象的解决方案?仅仅因为Java没有强大的泛型支持就必须构造一个工厂方法或其他接口,这似乎是错误的。

以下是我能想到的可能性:

1)接受List<?>作为构造函数的参数,并在构造函数中解析您需要的逻辑类型,如果它不是任何可接受的类型,则抛出异常。

2)创建一个接受任一列表的类,构造适当的User对象,然后返回该对象。

3)在List<Source1>List<Source2>周围创建可以传递给用户构造函数的包装器。

4)用两个类继承这个人的子类,除了构造函数,所有的功能都是继承的。一个的构造函数接受Source1,另一个接受Source2。

5)用一个构建器包装这个人,其中有两个不同的构建器方法,用于实例化的两个不同的数据源。

我的问题是:

1)这样做的需要是Java的缺陷,还是故意的设计决定?什么是直觉?

2)在维护良好的代码而不引入不必要的复杂性方面,哪种解决方案最强大?为什么?

这个问题是类似的:Designing constructors around type erasure in Java,但没有涉及细节,它只是建议了各种解决方法。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-06-07 19:03:34

通常的方法是使用factory methods

代码语言:javascript
运行
AI代码解释
复制
public static User createFromSource1(List<Source1> source) {
    User user = new User();
    // build your User object knowing you have Source1 data
    return user;
}

public static User createFromSource2(List<Source2> source) {
    User user = new User();
    // build your User object knowing you have Source2 data
    return user;
}

如果你只想使用Source1Source2构造(即你没有默认的构造函数),你只需隐藏你的构造函数,强制客户使用你的工厂方法:

代码语言:javascript
运行
AI代码解释
复制
private User () {
    // Hide the constructor
}

这个问题的出现是因为你不能以不同的方式命名构造函数,这就是如果这些是普通的方法,你将如何克服这个问题。因为构造函数名被固定为类名,所以这种代码模式是区分然后给出相同类型擦除的唯一方法。

票数 10
EN

Stack Overflow用户

发布于 2012-06-07 18:48:55

1:保持与擦除的向后兼容性。

2:你的类可以使用泛型吗?如下所示:

代码语言:javascript
运行
AI代码解释
复制
public class User<T> {
    private List<T> whatever;
    public User(List<T> source){
       ....
    }
}

我不确定这是不是你所说的(2)

票数 1
EN

Stack Overflow用户

发布于 2012-06-08 01:55:25

基本的问题是,该语言是在泛型存在之前设计的(构造函数名称是固定的),因此它不能处理由于类型擦除而导致的冲突,这通常会通过重命名方法来区分它们。

一种不使用工厂方法的“变通办法”是添加另一个非类型化参数,以使编译器能够区分它们:

代码语言:javascript
运行
AI代码解释
复制
public User(List<Source1>, Source1 instance) {
    // ignore instance
}

public User(List<Source2>, Source2 instance) {
    // ignore instance
}

不过这有点差劲,因为你可以用任何东西(例如IntegerString,或者简单地让其中一个省略第二个参数)来替换这些额外的参数,它仍然可以工作。此外,额外的参数被忽略-它的存在只是为了区分构造函数。然而,它确实允许代码在不添加任何额外方法或特殊代码的情况下工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10937889

复制
相关文章
java中的类型擦除type erasure
泛型是java从JDK 5开始引入的新特性,泛型的引入可以让我们在代码编译的时候就强制检查传入的类型,从而提升了程序的健壮度。
子润先生
2021/06/22
6540
初探Java类型擦除
本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。
SH的全栈笔记
2019/10/20
8850
java构造函数调用另一个构造函数_java中的构造函数
* 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
用户7886150
2021/04/29
4.6K0
Java泛型之类型擦除类型擦除参考资料
学过C++模板的,在使用Java泛型的时候,会感觉到有点不疑问,例如:(1)无法定义一个泛型数组、无法调用泛型参数对象中对应的方法(当然,通过extends关键字是可以做到,只是比较麻烦);(2)ArrayList<Integer>和ArrayList<String>在运行时的类型是相同的。Java中的泛型有这些问题,是它的实现机制决定的,即“类型擦除”。
阿杜
2018/08/06
6220
java类型擦除知多少
你觉得会执行成功吗?答案是会的。可能你会有疑问,list不是通过泛型限制成Integer类型了吗,怎么会执行成功呢。泛型是在编译期对类型进行安全检查的,上面是通过反射设值,反射是在运行期起作用的,这就引出了类型擦除的概念了。
索码理
2022/09/20
6500
【说站】java泛型中类型擦除的转换
2、这个特征被称为类型删除。当泛型被删除时,他有两种转换方法。第一种是,如果泛型没有设置类型上限,泛型将转换为Object类型,第二种是如果设置了类型上限,泛型将转换为其类型上限。
很酷的站长
2022/11/23
1.2K0
【说站】java泛型中类型擦除的转换
java构造函数方法声明无效_如何构造函数
Java构造函数,也叫构造方法,是JAVA中一种特殊的函数。与函数名相同,无返回值。
全栈程序员站长
2022/10/05
1.7K0
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
Bug开发工程师
2020/02/13
3.9K1
带你深挖Java泛型类型擦除以及类型擦除带来的问题
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
业余草
2020/02/13
1.8K0
【说站】java类型擦除的应用
以上就是java类型擦除的应用,希望对大家有所帮助。更多Java学习指路:Java基础
很酷的站长
2022/11/24
2150
【说站】java类型擦除的应用
Java泛型类型擦除问题
以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List<String> 和 List 在编译成字节码的时候实际上是一样的。因此java泛型只能做到编译期检查的功能,运行期间就不能保证类型安全。我最近遇到的一个问题如下:
用户7353950
2022/06/23
1.1K0
JAVA泛型与类型擦除
为什么要用T而不是其它字母?事实上是可以任意字符串(如Result< something >),但是为了显得专业,一般约定几个大写字母在不同场景使用。
acupt
2019/08/26
1.8K0
js 中的构造函数,构造函数作用,构造函数和普通函数的区别
函数的定义方式: 1.声明式函数定义: function 函数名 (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。 2.函数表达式:let fun = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。 3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。
全栈程序员站长
2022/10/04
3.6K0
Java里的构造函数(构造方法)
本文转载之https://www.cnblogs.com/livterjava/p/4709561.html
用户7886150
2021/01/31
2.5K0
[ Java学习基础 ] Java构造函数
   构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用。 Java构造方法的特点如下: 构造方法名必须与类名相同。 构造方法没有任何返回值,包括void。 构造方法只能与new运算符结合使用。 示例代码如下: 1 //Rectangle.java文件 2 package com.a51work6; 3 4 // 矩形类 5 public class Rectangle { 6 7 // 矩形宽度 8 int wi
Kevin_Zhang
2018/05/22
1.3K0
【进阶之路】Java的类型擦除式泛型
Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw Type),并且会在相应的地方插入强制转型的代码。
南橘
2022/03/07
1.2K0
【进阶之路】Java的类型擦除式泛型
java有参构造函数如何输出
不知道你说的什么意思,你建几个public变量给它存起来不就能用了么。如果是序列化,那么把所有属性序列化就可以了,传递的什么参数该做的改变它都做掉了,序列化不需要反映类中没有的字段。如果你是个新手,那么下面的例子可能有帮助。
用户7886150
2020/12/15
1.4K0
C++转换构造函数与类型转换构造函数
转换构造函数:  转换构造函数的只有一个形参: 1 Student(float s) 2 { 3 score = s; 4 age = 0; 5 }  如果已经在上面定义了构造函数: 1 Student(85); //建立对象c1,由于只有一个参数,调用转换构造函数 如果对“+”进行了重载,那么以下是编译错误的: 1 stu2 = stu1 + 85; //这样编译错误 2 stu2 = stu1 + Student(85); //合法,将85转换为
233333
2018/03/07
1.9K0
什么是java构造函数_什么是java构造函数
构造函数是面向对象中的一员,构造函数可以叫做构造器,它的函数名与类名相同,不用定义返回值类型,也没有具体的返回值。构造函数是在构建创造时对象时调用函数,作用是可以给对象进行初始化,创建对象都必须要通过构造函数初始化。一个类中如果没有定义过构造函数,那么该类会有一个默认的空参数构造函数。如果在类中定义了指定的构造函数,那么该类中的默认构造函数就没有了。
全栈程序员站长
2022/09/08
1.2K0
Java 构造函数的详解
我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的。那么我们在java里面怎么在对象一旦创建就赋值呢?
全栈程序员站长
2022/09/08
5690

相似问题

用泛型处理构造函数中的类型擦除

55

在Java中围绕类型擦除设计构造函数

31

由于类型擦除而导致的模糊构造函数

13

Java中的类型擦除

12

Java类型擦除

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文