gpt4 book ai didi

java - 具有扩展 Comparable 的泛型类型参数的强制转换接口(interface)

转载 作者:行者123 更新时间:2023-12-02 10:54:15 25 4
gpt4 key购买 nike

我有一个非常简单的接口(interface),带有通用类型参数。

public interface Foo<T> {
void add(T element);
}

现在,我在这样的类中有一个该接口(interface)的变量:

public class Bar {

private Foo<?> foo;

public void action() {
Object o = new Object();
(Foo<Object> foo).add(o); // in my case i know that this will work
}
}

但是现在,如果我修改接口(interface),使类型参数必须扩展 Comparable<T> ,怎样才能达到和上面一样的效果呢?

public interface Foo<T extends Comparable<T>> {
void add(T element);
}

public class Bar {

private Foo<?> foo;

public void action() {
Object o = new Object();
// compiler error, since Object does not extent Comparable
(Foo<Object> foo).add(o);
}
}

更新:

我有很多类实现这个接口(interface),例如:

public class IntFoo implements Foo<Integer> {

public void add(Integer element) {
// do something
}
}

在我的Bar我的类(class)有一个Foo<?>我想使用 add() 添加元素。我已采取预防措施(例如使用 instanceof )仅添加 Integer如果是 Foo<Integer> 类型.

最佳答案

要了解为什么您的方法没有按预期方式工作,您必须首先了解您使用的通配符 - ?,以及有关泛型与强制转换的一些背景知识。

带有通配符的泛型被视为“不关心”或 "unknown" type ;也就是说,您既不知道也不关心该泛型中的类型,因为由于类型删除,您以后无法检索它。

引入泛型是为了避免我们麻烦或需要转换为我们想要的特定类型。我们可以定义一个同类类型并简单地处理它,而不是每次都进行强制转换。泛型允许我们处理由于编译时错误的转换而导致的不匹配的类型,这意味着如果 Java 认为代码是错误的类型转换,则代码甚至无法编译。

由于强制转换是开发人员从编译器夺取控制权的唯一方法,因此如果进行强制转换,就告诉编译器您知道自己在做什么。如果您不这样做,您将收到运行时异常。

<小时/>

所有这些都是要说的......

Comparable 类型的任何元素放入 Bar唯一方法是如果您有一个类型化且绑定(bind)的泛型。

public class Bar<T extends Comparable<T>> implements Foo<T> {

private Foo<T> foo;

public void add(T object) {
foo.add(object);
}
}

关于java - 具有扩展 Comparable 的泛型类型参数的强制转换接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51902826/

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