Java 允许参数的泛型;或参数化泛型

Java 允许参数的泛型;或参数化泛型,java,generics,nested-generics,Java,Generics,Nested Generics,我正在玩一个有趣的建筑。人们可以创建包含StoredObjects的商店。存储可以支持由接口表示的不同操作(即获取、放置、打印) 下面是它的外观,高度简化: interface Put<Foo>{ public void put(Foo f); } class Store implements Put<Store.Obj<?>> { class Obj<T> { public T o; } @Ove

我正在玩一个有趣的建筑。人们可以创建包含StoredObjects的商店。存储可以支持由接口表示的不同操作(即获取、放置、打印)

下面是它的外观,高度简化:

interface Put<Foo>{
   public void put(Foo f); 
}

class Store implements Put<Store.Obj<?>> {
    class Obj<T> {
        public T o;
    }
    @Override
    public void put(Obj<?> o) { }


}

public class Main {
        public static void main(String[] args){
                Store s = new Store();
                Store.Obj<String> o = s.new Obj<>();
                s.put(o);

        }
}
接口Put{
公开认沽期权(Foo f);
}

类存储实现Put您需要某种方法来从Obj中提取T。让我们称之为Getter

现在,您的
Store
构造函数还必须包含
Getter
参数,以便您可以使用它实现get。然后,您的Store类变为:

class Store<O, I> implements Put<O>, Get<O, I> {
    private Getter<O, I> getter;
    public void put(O o) { … }
    public I get(O o) { … }
}
类存储实现Put、Get{
私人消气剂;
公开作废认沽权证(O){…}
公共我得到(O){…}
}

但是到那时,你也可以摆脱你的
存储
,直接使用getter。

我想我们可以从一开始就忘记更高级的类型,你知道你的建议是不可能的

这可能不是您想要的解决方案,但这是我在这个问题上的最佳缺点

由于我们无法创建新的参数化类型,因此我们将不得不求助于创建新的参数化值

首先,我们必须声明
Foo
是一种泛型类型。事实上,Java8中有一种类型更好:
Supplier

显然,问题在于,对于每种可能的
供应商类型T,您都需要多个
Get
实例/值,因此我们的值爆炸式增长:

Get<String, Supplier<String>> f = Supplier::get;
Get<Integer, Supplier<Integer>> g = Supplier::get;

供应商几乎可以包含您想要的任何内容,但我认为我们无法避免定义多个Get实例。

我不确定我是否理解这个问题。你想完成什么?也许你想要什么?不是真的,不是;Java的类型系统不支持更高级的类型,这是您正在寻找的类型的术语。@LouisWasserman,这太糟糕了。我来自C++的土地,(超级偶然)确实有这些高级类型。
class ObjTGetter<T> implements Getter<Obj<T>, T> {
    public T get(Obj<T> o) { return o.o; }
}
class Store<O, I> implements Put<O>, Get<O, I> {
    private Getter<O, I> getter;
    public void put(O o) { … }
    public I get(O o) { … }
}
interface Supplier<T> {
  T get()
}
Supplier<String> s = () -> "Hello";
Supplier<Integer> i = () -> 42;
interface Get<S, F extends Supplier<S>> {
    public S get(Supplier<S> foo);
}
Get<String, Supplier<String>> f = Supplier::get;
Get<Integer, Supplier<Integer>> g = Supplier::get;
String m = f.get(); //yield "Hello"
Integer n = g.get(); //yields 42