接口上嵌套参数化类型的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