接口上嵌套参数化类型的Java-Type变量
我有以下界面:接口上嵌套参数化类型的Java-Type变量,java,generics,Java,Generics,我有以下界面: public interface Box<T> { T get(); } // Could also choose not to have it extend Box interface public interface BiggerBox<T> extends Box<T> { Box<T> getBox(); default T get() { return getBox().get
public interface Box<T> {
T get();
}
// Could also choose not to have it extend Box interface
public interface BiggerBox<T> extends Box<T> {
Box<T> getBox();
default T get() {
return getBox().get();
}
}
想法是你可以做这样的事情:
BiggerBox<Box<String>> biggerBox = new SomeBiggerBox(new SomeBox("some string"));
String value = biggerBox.get();
BiggerBox BiggerBox=newsomebiggerbox(newsomebox(“somestring”);
字符串值=biggerBox.get();
我能做的最接近的事情是:
public interface BiggerBox<B extends Box> {
<U> U get();
}
公共接口BiggerBox{
U get();
}
但这没有编译时类型安全性
我认为这在Java中是不可能的,但我想知道这是否是真的(即使是通过mad hacks)
编辑:我不想向界面添加第二个类型参数,即no
BiggerBox
(这就是我认为不可能的原因)您需要将其作为第二个类型参数添加:
public interface BiggerBox<B extends Box<H>, H> {
H get();
}
公共接口BiggerBox{
H get();
}
您需要将其添加为第二个类型参数:
public interface BiggerBox<B extends Box<H>, H> {
H get();
}
公共接口BiggerBox{
H get();
}
在BiggerBox方法中没有使用“B”的任何内容,因此没有理由在泛型签名中使用它。BiggerBox中也没有强制“get”来自Box实例的内容,也没有强制构造函数获取Box实例的内容
这意味着BiggerBox应该简单地将“get”委托给一个Box实例
这里有一个用于此的抽象类:
// Could also choose not to have it implement Box interface
public abstract class BiggerBox<T> implements Box<T> {
private Box<T> box;
public BiggerBox(Box<T> box) {
this.box = box;
}
public T get() {
return box.get();
}
}
//也可以选择不让它实现Box接口
公共抽象类BiggerBox实现了一个Box{
私人信箱;
公共大盒子(盒子){
this.box=box;
}
公共部门得不到{
返回框。get();
}
}
或作为接口:
public interface Box<T> {
T get();
}
// Could also choose not to have it extend Box interface
public interface BiggerBox<T> extends Box<T> {
Box<T> getBox();
default T get() {
return getBox().get();
}
}
//也可以选择不让它扩展Box接口
公共接口BiggerBox扩展了BiggerBox{
Box getBox();
默认的T get(){
返回getBox().get();
}
}
在BiggerBox方法中没有使用“B”的任何内容,因此没有理由在泛型签名中使用它。BiggerBox中也没有强制“get”来自Box实例的内容,也没有强制构造函数获取Box实例的内容
这意味着BiggerBox应该简单地将“get”委托给一个Box实例
这里有一个用于此的抽象类:
// Could also choose not to have it implement Box interface
public abstract class BiggerBox<T> implements Box<T> {
private Box<T> box;
public BiggerBox(Box<T> box) {
this.box = box;
}
public T get() {
return box.get();
}
}
//也可以选择不让它实现Box接口
公共抽象类BiggerBox实现了一个Box{
私人信箱;
公共大盒子(盒子){
this.box=box;
}
公共部门得不到{
返回框。get();
}
}
或作为接口:
public interface Box<T> {
T get();
}
// Could also choose not to have it extend Box interface
public interface BiggerBox<T> extends Box<T> {
Box<T> getBox();
default T get() {
return getBox().get();
}
}
//也可以选择不让它扩展Box接口
公共接口BiggerBox扩展了BiggerBox{
Box getBox();
默认的T get(){
返回getBox().get();
}
}
Ah,但我只想声明一个类型,这将允许我执行BiggerBox
但我只想声明BiggerBox
Ah,但我只想声明一个类型,这将允许我执行BiggerBox
但我只想声明BiggerBox