Java 方法返回类型以实现多个接口-再次
今天我遇到了以下问题。考虑设置:Java 方法返回类型以实现多个接口-再次,java,generics,inheritance,interface,return-value,Java,Generics,Inheritance,Interface,Return Value,今天我遇到了以下问题。考虑设置: interface A { void foo(); } interface B { void bar(); } class Impl implements A,B { public void foo() { } public void bar() { } } class Usage { void worksAsParameter(){ acceptIt(new Impl()); }
interface A {
void foo();
}
interface B {
void bar();
}
class Impl implements A,B {
public void foo() { }
public void bar() { }
}
class Usage {
void worksAsParameter(){
acceptIt(new Impl());
}
<T extends A & B> void acceptIt(T foo){
}
<T extends A & B> T returnIt(){
return new Impl(); // <-- Compile error
}
}
我最初的假设是,实现类(在本例中是用法
)决定了T
的具体类型,但它必须扩展A
和B
。显然是调用方/调用站点决定了T
是什么,并且Usage
必须提供一个可分配给T
的值。但是,由于T
只是一个编译时处理,因此除了null
之外,不可能提供这样的值(因为它可以分配给任何对象)。
Afaik这意味着表单中的任何代码只能返回null
:
<T extends A> T returnIt(){
return x; // <-- Compile error
}
T returnIt(){
返回x;//原因
<T extends A & B> T returnIt(){
return new Impl();
}
这定义了两个泛型
<T extends A, B>
其中T必须扩展A和B。您可以像下面那样使用它
<T extends A, B> T returnIt(){
return (T) new Impl(); // <-- cast it to type T
}
T returnIt(){
return(T)new Impl();//您还可以执行以下操作以避免编译错误
<T extends A & B> T returnIt(Class<T> type) {
return type.cast(new Impl());
}
T returnIt(类类型){
返回类型.cast(新Impl());
}
谢谢。问题仍然是一样的:)为什么你的AB示例能够工作?它从调用方的角度强制所有返回的对象必须是AB的子类。另外,我问题的第二部分是,是否可以构造任何可以工作的对象(null除外)有效吗?我的意图是保证返回的对象实现A和B。不多也不少。T可以是任何扩展A&B和AB扩展A&B的类。在这种情况下,您需要使用cast(T)
并注意调用方可能需要一个特定的类。或者您不使用泛型并使用Impl
那么我是否将其理解为“否”?null
将是其可能返回的唯一值?
Impl returnIt(){
return new Impl();
}
<T extends A, B>
<T extends A & B>
<T extends A, B> T returnIt(){
return (T) new Impl(); // <-- cast it to type T
}
<T extends A & B> T returnIt(Class<T> type) {
return type.cast(new Impl());
}