Java 允许参数的泛型;或参数化泛型
我正在玩一个有趣的建筑。人们可以创建包含StoredObjects的商店。存储可以支持由接口表示的不同操作(即获取、放置、打印) 下面是它的外观,高度简化: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
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