Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重构泛型_Java_Generics_Refactoring - Fatal编程技术网

Java 重构泛型

Java 重构泛型,java,generics,refactoring,Java,Generics,Refactoring,坦率地说,我远不是泛型专家,我必须重构一些代码。 我有三个子类:classD、classR和classS。 每个类都扩展了classAbstractA。 子类的目标非常相似,每个子类在方法m()中都有类似的代码。因此,我认为如果我能从子类中提取方法m()并将其替换一级(到类AbstractA中),那就不错了 但也有一些区别: D类可与以下各项配合使用: Map<String, Map<BigInteger, BigInteger>> counts = new HashMa

坦率地说,我远不是泛型专家,我必须重构一些代码。 我有三个子类:classD、classR和classS。 每个类都扩展了classAbstractA。 子类的目标非常相似,每个子类在方法m()中都有类似的代码。因此,我认为如果我能从子类中提取方法m()并将其替换一级(到类AbstractA中),那就不错了

但也有一些区别:

D类可与以下各项配合使用:

Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, Set<BigInteger>>> sums = new HashMap<String, Map<BigDecimal, Set<BigInteger>>>();
Map<String, Map<String, BigInteger>> counts = new HashMap<String, Map<String,BigInteger>>();
Map<String, Map<BigDecimal, Set<String>>> sums = new HashMap<String, Map<BigDecimal, Set<String>>>();
Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, BigInteger>> sums = new HashMap<String, Map<BigDecimal, BigInteger>>();
Map counts=newhashmap();
Map sums=新的HashMap();
R类与:

Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, Set<BigInteger>>> sums = new HashMap<String, Map<BigDecimal, Set<BigInteger>>>();
Map<String, Map<String, BigInteger>> counts = new HashMap<String, Map<String,BigInteger>>();
Map<String, Map<BigDecimal, Set<String>>> sums = new HashMap<String, Map<BigDecimal, Set<String>>>();
Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, BigInteger>> sums = new HashMap<String, Map<BigDecimal, BigInteger>>();
Map counts=newhashmap();
Map sums=新的HashMap();
和类S一起工作:

Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, Set<BigInteger>>> sums = new HashMap<String, Map<BigDecimal, Set<BigInteger>>>();
Map<String, Map<String, BigInteger>> counts = new HashMap<String, Map<String,BigInteger>>();
Map<String, Map<BigDecimal, Set<String>>> sums = new HashMap<String, Map<BigDecimal, Set<String>>>();
Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, BigInteger>> sums = new HashMap<String, Map<BigDecimal, BigInteger>>();
Map counts=newhashmap();
Map sums=新的HashMap();

关于上述泛型的可能修改的任何提示都是受欢迎的,这可能会产生一个更“通用”的版本(可以移动到类AbstractA,并且仍然可以被三个子类使用。)

您需要做的第一件事是在
String
BigInteger
之间创建一些通用性。我的建议是创建一个新类,该类由以下两种类型组成:

public class Special  
{  
    private String string;  
    private BigInteger bigInt;  
    ...
}  
现在您可以更改
贴图的参数,如下所示:

Map<String, Map<Special, BigInteger> ...  

Map下面的实现如何

公共抽象类AbstractA{
受保护地图计数;
保护映射和;
公屋{
//使用计数和和的因式分解代码
}
}
公共类D扩展了AbstractA{
公共D(){
计数=新的HashMap();
sums=新的HashMap();
}
}
公共类R扩展了AbstractA{
公共资源({
计数=新的HashMap();
sums=新的HashMap();
}
}
公共类S扩展了抽象{
公共服务({
计数=新的HashMap();
sums=新的HashMap();
}
}
抽象类A{
映射计数=新的HashMap();
Map sums=新的HashMap();
}
类AbstractB扩展了AbstractA{
}
类D扩展了抽象B{
}
类R扩展了抽象b{
}
类S扩展了抽象{
}

您只需要两个通用参数:

public abstract class AbstractA<K, V> {
    private Map<String, Map<K, BigInteger>> counts = new HashMap<String, Map<K, BigInteger>>();
    private Map<String, Map<BigDecimal, V>> sums = new HashMap<String, Map<BigDecimal, V>>();

    public void m() {
    }
}


public class D extends AbstractA<BigInteger, Set<BigInteger>> {
}

public class R extends AbstractA<String, Set<String>> {
}

public class S extends AbstractA<BigInteger, BigInteger> {
}
公共抽象类AbstractA{
私有映射计数=新HashMap();
私有映射和=新HashMap();
公屋{
}
}
公共类D扩展了AbstractA{
}
公共类R扩展了AbstractA{
}
公共类S扩展了抽象{
}

不确定如何将
字符串
比特格尔
进行协调……可能是
字符串
473894790327849328490829042
,可以转换为
大整数
?如果显示
m()的三个实现的代码,就会更容易考虑这一点
您要替换的类。请记住,如果有人想添加一个与m()版本完全不同的类Q,这个解决方案对其他程序员来说将是一件非常痛苦的事情。@luiges90我想是的,但这可能意味着一个实现会进行一些解析,而另一个则不会。这不能只用泛型来解决。