也许这之前已经问了一个问题,但像往常一样提通用字第二,你获得千元解释的答案类型擦除.我通过相位去很久以前,现在知道了很多关于泛型和它们的使用,但这种情况是一个稍微更微妙的一个.
我有表示数据在电子表格,这实际上以两种格式存储的数据的单元的容器,包括:作为用于显示的字符串,而且在另一种格式,依赖于数据(存储为对象).所述细胞还保持该型之间转换的变压器,也确实为类型有效性检查(例如,检查IntegerTransformer如果字符串是有效的整数,并且如果它是返回一个整数来存储和反之亦然).
单元格本身没有输入,因为我希望能够更改格式(例如,将二级格式更改为浮点而不是整数,或更改为原始字符串),而无需使用新类型重建单元格对象.之前的尝试确实使用了泛型类型,但是一旦定义了编码变得非常庞大并且有很多反射,就无法改变类型.
问题是:如何以键入的方式从我的Cell中获取数据?我进行了实验,发现使用泛型类型可以使用方法完成,即使没有定义约束
public class Cell {
private String stringVal;
private Object valVal;
private Transformer<?> trans;
private Class<?> valClass;
public String getStringVal(){
return stringVal;
}
public boolean setStringVal(){
//this not only set the value, but checks it with the transformer that it meets constraints and updates valVal too
}
public <T> T getValVal(){
return (T) valVal;
//This works, but I don't understand why
}
}
Run Code Online (Sandbox Code Playgroud)
让我失望的是:那是?它不能投射任何东西,没有类型T的输入限制它匹配任何东西,实际上它并没有真正说任何地方.具有返回类型的Object除了在任何地方都给出了铸造复杂功能之外什
在我的测试中我设置了一个Double值,它存储了Double(作为一个对象),当我做了Double testdou = testCell.getValVal(); 它立即起作用,甚至没有未经检查的施法警告.但是,当我做String teststr = testCell.getValVal()时,我得到了一个ClassCastException.真的不足为奇.
我在这看到两种观点:
一:使用未定义的强制转换似乎只不过是一种将投射放在方法内而不是在返回后放在外面的一种躲避方式.从用户的角度来看它非常简洁,但是该方法的用户必须担心使用正确的调用:所有这一切都是隐藏复杂的警告和检查直到运行时,但似乎工作.
第二种观点是:我不喜欢这段代码:它不干净,它不是我在写作时自豪的代码质量.代码应该是正确的,而不仅仅是工作.错误应该被捕获并处理,并预计,即使只有expecter用户自己的接口应该是万无一失的,我总是喜欢一个灵活的通用的,可重用的技术尴尬的一关.问题是:有没有正常的方法来做到这一点?这是一种偷偷摸摸的方式来实现无类型,所有接受的ArrayList,它返回你想要的任何东西,而不是铸造?或者有什么我在这里失踪的.有些东西告诉我,我不应该相信这段代码!
也许更多的是一个比我想要的哲学问题,但我猜这就是我所要求的.
编辑:进一步测试. …
我有一个问题,让ArrayList正确使用overriden equals.问题是我正在尝试使用equals来测试单个键字段,并使用ArrayList.contains()来测试是否存在具有正确字段的对象.这是一个例子
public class TestClass {
private static class InnerClass{
private final String testKey;
//data and such
InnerClass(String testKey, int dataStuff) {
this.testKey =testKey;
//etc
}
@Override
public boolean equals (Object in) {
System.out.println("reached here");
if(in == null) {
return false;
}else if( in instanceof String) {
String inString = (String) in;
return testKey == null ? false : testKey.equals(inString);
}else {
return false;
}
}
}
public static void main(String[] args) {
ArrayList<InnerClass> objectList = new ArrayList<InnerClass>();
//add some …Run Code Online (Sandbox Code Playgroud) 一个困难的问题,我接近放弃所有的希望.我正在尝试创建一个函数,但是在ArrayList.toArray()返回我想要的类型时遇到了问题.
这是演示我的问题的最小例子:
public static <T> T[] test(T one, T two) {
java.util.List<T> list = new ArrayList<T>();
list.add(one);
list.add(two);
return (T[]) list.toArray();
}
Run Code Online (Sandbox Code Playgroud)
通常我可以使用表单,(T[]) list.toArray(new T[0])但有两个额外的困难:
(T[]) myObjectArray给出一个ClassCastExceptionnew T[].我也不能在其中一个元素上使用克隆ArrayList或尝试获得它的类.我一直在尝试使用以下调用获取一些信息:
public static void main(String[] args) {
System.out.println(test("onestring", "twostrings"));
}
Run Code Online (Sandbox Code Playgroud)
结果[Ljava.lang.Object;@3e25a5表明返回的类型转换无效.奇怪的是以下几点:
public static void main(String[] args) {
System.out.println(test("onestring", "twostrings").getClass());
}
Run Code Online (Sandbox Code Playgroud)
回来:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at patchLinker.Utilities.main(Utilities.java:286)
Run Code Online (Sandbox Code Playgroud)
所以我最好的猜测是它认为它是一个明智的String数组标签,但内部是一个Object数组,任何访问尝试都会带来不一致性.
如果有人能找到解决这个问题的方法(因为我拒绝了两个正常的解决方法),我会非常感激.
K.Barad JDK1.6 …
我最近才开始在java中使用zip文件.到目前为止,似乎所有人都计划好了,但我有最后一个障碍:嵌套拉链.
我正在尝试搜索具有特定扩展名的文件,以便将它们作为文本文件读取.到目前为止,我可以很高兴地读取zip文件中的文件,但我知道拉链内的一些文件嵌套在其他拉链内.
有没有办法从ZipEntry中搜索创建ZipFile对象而无需解压缩文件?
没有代码示例,因为它不是直接的代码问题.
K.Barad
编写dos批处理脚本时我遇到了一种情况.我用来计算文本字符串的CRC(校验和)的工具要求文本在文件中.我试图获取CRC的数据是文件名,但是当使用批处理将此文件名放入文本文件来计算CRC时,批处理脚本自然地将行结束(CR/LF)和空白行放在结束.由于这会导致CRC错误,这是一个问题.
有没有办法让批处理脚本写入文本文件而不附加行结尾?IE输出单行未完成文件?
-K.Barad
有趣的情况.我有一段代码创建了几个ZipOutputStreams.在我考虑写任何东西之前作为安全检查,我检查我的输出流是否已正确初始化:
ZipOutputStream countStream = null;
File countFile = null;
// other files
try {
countFile =
new File(savePath.getCanonicalPath() + savePath.separator + outputTag
+ "_COUNT_OUTPUTS.zip");
// other files
} catch (Exception e) {
outputLog.add("UNABLE TO FIND SAVE PATH");
return util.FILE_INVALID;
}
try {
// prepare outputs
if (countFile.exists() == true) {
countFile.delete();
} else {
}
countStream = new ZipOutputStream(new FileOutputStream(countFile));
// other files
} catch (Exception e) {
e.printStackTrace();
outputLog.add("UNABLE TO CREATE OUTPUT FILES");
return util.FILE_SAVE_FAIL;
}
if (countStream == …Run Code Online (Sandbox Code Playgroud) java ×5
arraylist ×2
casting ×2
generics ×2
zip ×2
arrays ×1
batch-file ×1
dos ×1
equals ×1
inputstream ×1
io ×1
methods ×1
nested ×1
newline ×1
outputstream ×1
overriding ×1
text-files ×1
warnings ×1