gpt4 book ai didi

java - 使用泛型参数类型重载构造函数(扩展与扩展和接口(interface))

转载 作者:行者123 更新时间:2023-11-30 06:08:19 25 4
gpt4 key购买 nike

A is abstract

public <T extends A> B(T parameter) {
//...do some stuff with A features
}
public <T extends A & I> B(T parameter) {
//...do some stuff with A and I features
}

这段代码不起作用,因为java说:方法B(T)的删除与类型B中的另一个方法相同

但是为什么呢?我不明白。当我有一个对象 A 时,采用第一个构造函数,当 A 实现另一个构造函数时...

我的意思是你可能想说在这种情况下 A 总是实现 I,但没有:

看看这个:

C1 扩展 A

C2 扩展 A

C3 扩展 A 实现 I

C1 和 C2 将调用第一个构造函数,C3 将调用第二个构造函数。为什么这是不可能的?

我不能这样做:

A is abstract

public B(A parameter) {
//...do some stuff with A features
}
public B(I parameter) {
//...do some stuff with I features
}

因为如果 A 实现 I 它总是会选择第一个构造函数。如果您知道避免此问题的另一种方法,请告诉我。

最佳答案

这是一个遗留问题。请参阅此问题的解释:Method has the same erasure as another method in type

你只能通过使用两个不同名称的两个不同工厂方法来真正解决这个问题:

class B {
public static <T extends A> B create(T param) {
return new B(/*...*/);
}

public static <T extends A & I> B createWithI(T param) {
return new B(/*...*/);
}

private B(/*args*/) {
//...
}
}

或者,如Khelwood建议,使用 instanceof:

class B
{
@SuppressWarnings("unchecked")
public <T extends A, AI extends A & I> B(T param) {
if (param instanceof I) {
AI ai = (AI) param;
// A and I
}
else {
// Just A
}
}
}

关于java - 使用泛型参数类型重载构造函数(扩展与扩展和接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50815321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com