[英]Bound mismatch error on generics type argument for a generic class that extends another generic class
[英]Can a Java argument be type-bound by a Class contained in another object?
注意:这个问题主要是理论上的; 从那以后,我就放弃了立即使用它,因为我想过的所有事情都使我的代码过于复杂,并且闻起来有点像反模式。 但是,我认为它在理论上很有趣,并且希望社区对此提供帮助。
我正在整理一些世纪之交编写的用于图像处理的代码; 首先将具有很多冗余的单个类切分成多个BiFunction过滤器。 它们每个接受一个BufferedImage和一个强度(Double),然后返回一个新的BufferedImage。 当然,这些图像滤镜中的许多还有其他问题,例如效应半径或其他强度,如果我要高效地链接它们,我希望能够将它们设置为“均匀”(或准)。 -常数)。
我当前的方法只是简单地进一步扩展ImageFilter类,并将统一设置为Bean样式的属性。 我最初想做的是将它们约束为一个通用类,该类保存在一个接口中,并且具有以下特点:
public void addProperty(Uniform<T> property, T type)
在这里,T完全由Uniform指定。
原始的类将所有这些制服按String名称保留在HashMap中,但这是许多不良习惯的开始,每次我看到它时,我都会对其进行清理。 如果拼写错误导致代码失误,那是不负责任的代码。 我宁愿像长大成人一样只在那儿使用Singleton。
因此,总而言之,在Java中是否可以将参数类型绑定到另一个参数的泛型? 如果是这样,怎么办? 如果不是,是否有人知道将来有任何以这种方式扩展Java泛型的计划?
感谢您的输入!
是的,我们可能要做的就是在方法本身上定义type参数。 检查下面的示例。
公共类制服{
}
public class ImageFilter {
//store in a list which can store any type of Uniform
List<Uniform<?>> uniformList = new ArrayList<Uniform<?>>();
//store in a map which can store any type of uniform and uses type as key
Map<Class<?>, Uniform<?>> uniformMap = new HashMap<>();
//Type parameter 'T' on the method itself
public <T> void addProperty(Uniform<T> property, T type) {
uniformList.add(property);
uniformMap.put(type.getClass(), property);
}
}
{
//sample usage
new ImageFilter().addProperty(new Uniform<>(), "test");
new ImageFilter().addProperty(new Uniform<>(), new Double(2.0));
}
以下是示例用法
new ImageFilter().addProperty(new Uniform<>(), "test");
//or
new ImageFilter().addProperty(new Uniform<String>(), "test");
//if for some reason JVM can't infer the type itself, it can be set manually
new ImageFilter().<String>addProperty(new Uniform<String>(), "test");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.