繁体   English   中英

Java参数可以由包含在另一个对象中的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM