gpt4 book ai didi

java - 通用类型转换/实例检查/排除类型参数

转载 作者:行者123 更新时间:2023-12-02 08:59:17 24 4
gpt4 key购买 nike

问题。

一个Detect可以提供 Detectables特定类型 ,看起来像

interface Detectable
{/*...*/}

interface Some_detectable extends Detectable
{/*...*/}

一个supply Detect中的方法应该能够接受任何 Detectable并且仅当它是特定类型时才提供它。我想象所描述的情况是这样的

abstract
class Detect<D extends Detectable>
{
private final Set<D>
DETECT= new LinkedHashSet<>();

void
supplying(Detectable d)
{
/*[ DETECT.add(d); ]*/
/*supply d if of type D*/
}
}

尝试。

首先我尝试制定一种方法来接受 D另一种方法处理参数不是 D 的情况但只是任何Detectable .

不幸的是我无法排除D来自第二种方法或类类型 D .

因此,这些方法可能会导致方法不明确(如果 D 是原始 Detectable )

abstract
class Detect<D extends Detectable>
{
/*...*/
void
supplying(D d)
{
DETECT.add(d);
}
void
supplying(Detectable d){}
}

我目前的工作,但解决问题的尝试丑陋

abstract
class Detect<D extends Detectable>
{
final Set<D>
DETECT= new LinkedHashSet<>();

void
supplying(Detectable d)
{
D
casted= try_cast(d);

if(casted==null) {return;}
DETECT.add(casted);
}

abstract protected D
try_cast(Detectable detectable);
}

class
Some_detect
extends Detect<Some_detectable>
{
@Override protected Some_detectable
try_cast(Detectable d)
{
return d instanceof Some_detectable
? (Some_detectable)d
: null;
}
}

最佳答案

我建议你存储一个Class<D>类的对象并用它来检查 d 的类。 Java泛型会在运行时被删除,所以你不能写像d instanceof D这样的东西。不存储此类。

这里是示例代码(抱歉,我编辑了您的代码以符合 Java 代码风格):

interface Detectable {}
interface SomeDetectable extends Detectable {}

abstract class Detect<D extends Detectable> {
private final Class<D> dClass;
private final Set<D> detect = new LinkedHashSet<>();

protected Detect(Class<D> dClass) {
this.dClass = dClass;
}

void supplying(Detectable d) {
if (dClass.isInstance(d)) {
detect.add(dClass.cast(d));
}
}
}

class SomeDetect extends Detect<SomeDetectable> {
SomeDetect() {
super(SomeDetectable.class);
}
}

您可以将基类设为 Detect<D>在这种特殊情况下,通过自动查找类型参数更容易使用,因为它实际上存储在类元数据中。但这是一种脆弱的方法,我一般不推荐它。

关于java - 通用类型转换/实例检查/排除类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60289306/

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