我有以下两种java方法(简化)。我想用一种方法替换这两种方法。想要这样做的原因是一种方法用于本地测试,一种方法在Hadoop集群上运行时使用。我只是花了一段时间调试我的代码,然后才意识到我调整了一种方法而不是另一种方法,并想知道如何在将来避免这种愚蠢的错误。
public MyObject(ArrayList<String> values){
for(String val: values){
System.out.println(val.toString());
}
}
public MyObject(Iterable<Text> values){
for(Text val: values){
System.out.println(val.toString());
}
}
Text是一个apache hadoop类。这是源代码的链接。 http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/com.cloudera.hadoop/hadoop-core/0.20.2-737/org/apache/hadoop/io/Text.java
答案 0 :(得分:5)
由于您未在构造函数中使用String
或Text
(无论是什么)特定的任何内容,因此您可以将Iterable<? extends Object>
作为参数:
public MyObject(Iterable<? extends Object> values){
for(Object val: values){
System.out.println(val.toString());
}
}
答案 1 :(得分:2)
你可以这样做:
public MyObject(Iterable<? extends Object> values){
for(String val: values){
System.out.println(val.toString());
}
}
完全失去第一个构造函数。
或者看看你是否可以让一个构造函数修改参数然后调用另一个。
答案 2 :(得分:2)
尝试使用 Generic 。
ArrayList也实现了Iterable,因此任何实现Iterable
的东西都可以传入构造函数。
不需要任何其他构造函数。这个单一的构造函数可以用于所有类型的Iterable
类。
public class MyObject<T> {
public MyObject(Iterable<T> values) {
for (T val : values) {
System.out.println(val.toString());
}
}
}
答案 3 :(得分:0)
Text
是您自己代码库中的一个类吗?如果是这样,你能否实现CharSequence
java.util.String
已经实现的public MyObject(Iterable<? extends CharSequence> values) { ... }
(在Java的更高版本中 - 从那以后不确定)。然后你的一个人将是:
MyObject
(我假设你的真实代码在ctor中做的不仅仅是打印对象;否则你为什么要首先创建一个{{1}}实例?)
答案 4 :(得分:0)
你可以试试......
public MyObject(Collection collection) {
for (Object obj : collection) {
System.out.println(obj.toString());
}
}