我正在使用 JAVA 编写我在 VB.NET 中的程序的副本。我正在创建“DataGrids”(使用 JTable)并编程工具提示以显示在我的 JTable 的单元格上......是的,在 JAVA 中,您必须从头开始做所有事情。
好的,当编写以下代码行时,我的好奇心就开始了,程序中挂起了错误:
DataGridMed = new JTable(){
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int col){
Component c = super.prepareRenderer(renderer, row, col);
if(c instanceof Component){
JComponent jc = (JComponent) c;
jc.setToolTipText((String) getValueAt(row,col)); <--- ERROR
}
return c;
}
};
我有点愤慨,因为当我进行这样的转换时,我不是将那个值转换为 String 对象吗?当我将该行更改为 .toString() 时,错误完全消失了……!
jc.setToolTipText(getValueAt(row,col).toString);
我清楚地知道“String”是一个类,它不属于原始数据类型组(int、boolean、float、double ......)。这就是为什么在比较两个字符串时,“==”运算符不起作用,您需要使用“.Equals()”...但在这种情况下,我没有区分强制转换和使用 .toString 之间的区别。 ()。
这里到底发生了什么?
如果您转到
Java
该部分的文档,JTable
您可以看到该方法getValueAt
返回一个Objeto
:因此,在尝试强制转换时,它会尝试
String
直接从对象生成 ,如果它不从 扩展String
,则无法强制转换。但是,该方法
toString
调用在toString
继承自 的所有数据上找到的方法Object
,并且该方法确实以 的形式呈现 Object 表示String
。因此,如果演员表不正确,则使用第一种方法会出现错误。但是,对于第二个,您不会收到错误,因为您引入的数据类型是
String
方法需要的setToolTipText
。首先,容易。
toString()
它只是一个将对象的表示形式返回为的方法String
。由于它是 定义的一部分Object
,所有类都有该方法(尽管基本实现没有多大帮助)。也就是说,对于任何对象,您都可以制作objeto.toString()
并获得String
.(String)
对字符串进行强制转换。当你有一个对象的引用时,当对一个子类变量进行赋值时,你必须指定cast
. 对象的类不会改变,如果你试图为一个不是cast
aString
的对象创建一个 aString
,那么在运行时它会抛出一个异常(ClassCastException
)。它像这样工作正如他们已经说过的:
.toString()
<-- 是一种返回对象的文本表示的方法String
<-- 是一个对象(字符串数据类型)当使用
(String)objeto
的目的是将所述对象String
直接转换为时,可能会出现转换错误,当使用.toString()
<-- 它总是将对象转换为 aString
,尽管有时它不会返回预期值。