是否可以将Java中的对象转换为组合的泛型类型?
我有一个类似的方法:
public static <T extends Foo & Bar> void doSomething(T object) {
//do stuff
}
如果我具有同时实现两个接口(Foo和Bar)的类,则调用此方法没有问题。
问题是当我需要调用此方法时,将接收我需要传递给它的对象,java.lang.Object
并且我需要对其进行强制转换以使编译器满意。但我不知道该如何进行演员表转换。
编辑:
问题在于这样的函数:
public void problemFunction (Object o) {
if ( o instanceof Foo && o instanceof Bar) {
doSomething((Problematic cast) o);
}
}
}
不幸的是,没有任何法律手段可以满足这种情况。必须有一个已知的单一类型来实现您需要作为边界的所有接口,以便可以将其强制转换为它。可能是您为此目的创建的类型,也可能是某些现有类型。
interface Baz extends Foo, Bar { }
public void caller(Object w) {
doSomething((Baz) w);
}
如果已知其他类型(例如Baz
)满足范围,则可以测试这些类型,并在调用方中有一个分支,该分支将强制转换doSomething
为这些类型。不好看
您还可以使用委托,创建自己的类Baz
,该类满足的要求doSomething
。然后将您要传递的对象Baz
包装到类的实例中,然后将该包装器传递给doSomething
。
private static class FooBarAdapter implements Foo, Bar {
private final Object adaptee;
FooBarAdapter(Object o) {
adaptee = (Foo) (Bar) o;
}
public int flip() { return ((Foo) adaptee).flip(); }
public void flop(int x) { ((Foo) adaptee).flop(x); }
public void blort() { ((Bar) adaptee).blort(); }
}
public void problemFunction (Object o) {
doSomething(new FooBarAdapter(o));
}
编译以下Java代码: 此外,编译以下代码: 以下代码将给我一个编译错误: 因此,看起来,如果其中一个边界类型本身是类型参数,就不可能有多个边界。但为什么呢? 据我所知,如果声明了多个边界,那么最多一个边界可能是一个类(其他所有边界都是接口),并且它必须是第一个边界。 但是,既然在我的示例中是一个接口,为什么编译器会抱怨呢?毕竟,T是接口还是类应该没有任何区别。 我试图在网上找到答案,但显然我的谷
问题内容: 我最近看到,可以声明一个返回类型,该返回类型也受接口限制。考虑以下类和接口: 我可以这样声明一个返回类型: 如果我从某个地方调用该方法,那么IDE会告诉我返回类型具有方法以及,但是仅当我在 Function 后面指向一个点时才这样: 有没有办法获得对这样一个对象的引用?我的意思是,如果我愿意做这样的事情: 我想有一个这样的参考(伪代码): 这在Java中是有可能的,还是我只能声明这样的
问题内容: 我想拥有一个Class对象,但是我想强迫它代表的任何类扩展A类并实现接口B。 我可以: 要么: 但我不能两者都做。有没有办法做到这一点? 问题答案: 实际上,你可以做你想做的事。如果要提供多个接口或一个类加接口,则必须使通配符看起来像这样: 请参见sun.com上的泛型教程,特别是页面底部的“ 绑定类型参数”部分。实际上,如果需要,你可以列出多个接口,并& InterfaceName根
我正在使用Spring和Hibernate进行JSF项目,其中包括许多遵循相同模式的: > 接收并返回转换为 代码基本如下(省略检查): 鉴于大量的s与此完全相同(当然除了和的类型),我想知道是否值得使用一个通用转换器。泛型本身的实现并不困难,但我不确定声明bean的正确方法。 一个可能的解决方案如下: 1-编写泛型实现,我们称之为,没有任何Bean注释 2-将特定的转换器编写为MyGeneric
它是关于java中具有两种泛型类型(一种用于返回类型,另一种用于形式参数)的泛型方法以及如何实现它。我想我在图片中缺少一些东西来让它工作。 事情是这样的... 这是工作 : 这不起作用: java编译器告诉我: 好吧,就是这样。提前感谢大家!希望它能在未来帮助别人! P、 D:这不是枚举类型的问题。它发生在类和层次结构之间。所以别怪Enum了,我试过了,但没用。 对于泛型参数 我们可以做一个一般规
问题内容: 所以我有一张地图: 我会像这样添加元素: 我有如下通用方法: 现在,这段代码可以很好地工作,并且没有编译器问题: 但是,当我尝试这样做时: 编译器向我显示以下警告:类型安全:通用方法verifyType(String,Class)的未经检查的调用verifyType(String,Class) 这让我感到困惑…请帮助… 问题答案: 更改: 至 通过仅将类型声明为“ Class”,就失去