这是一个快速的小通用类,使这个问题更容易理解.如果你愿意,你可以假装它"装箱"一个值.
public class Box<T> { }
Run Code Online (Sandbox Code Playgroud)
现在,在我的main方法中,我可以这样:
Box b1 = new Box<>();
Box<?> b2 = b1;
Box b3 = b2;
Run Code Online (Sandbox Code Playgroud)
所以我很清楚,带有通配符的raw Box和Box参数化都可以同时传递给彼此的类型.
Object box = (Box<?>)(Box) (Box<?>)(Box) ... new Box<>();// Valid (without the ellipsis)
Run Code Online (Sandbox Code Playgroud)
那么为什么我List的原始盒子不能被转换成List通配符盒,反之亦然?(如果你能找到它,那么任何负责编译错误的文档都会出现以下代码.)
List<Box> rawBoxes = new LinkedList<>();
List<Box<?>> wildcardBoxes = new LinkedList<>();
Object o1 = (List<Box<?>>) rawBoxes;// Cannot cast from List<Box> to List<Box<?>>
Object o2 = (List<Box>) wildcardBoxes;// Cannot cast from List<Box<?>> to List<Box>
Run Code Online (Sandbox Code Playgroud)
"不能施放 …
我一直在用Java编写自己的小项目,最近,我编译了它并收到了这个错误:
线程"main"中的异常java.lang.IllegalAccessError:超类访问检查失败:类kröw.zeale.v1.program.core.DataManager$ ConstructList(在未命名模块@ 0x4563e9ab中)无法访问类com.sun.javafx.collections.ObservableListWrapper (在模块javafx.base中)因为模块javafx.base没有将com.sun.javafx.collections导出到未命名的模块@ 0x4563e9ab
所以,我目前有三个不同的类,都在同一个包中.我的层次结构如下:
• Kröw
• DataManager
? ConstructList
Run Code Online (Sandbox Code Playgroud)
在我的程序的早期版本中,我的层次结构是这样的:
• Kröw
? DataManager
- ConstructList
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,ConstructList延长com.sun.javafx.collections.ObservableListWrapper<Construct>.(我不认为Construct这里的班级是必要的,我宁愿不展示它,但如果需要,我可以.)
无论如何,现在,我的IDE可以按预期运行应用程序,但是,当我导出它时,上面的例外是给我的.
完整堆栈跟踪:
Exception in thread "main" java.lang.IllegalAccessError: superclass access check failed: class kröw.zeale.v1.program.core.DataManager$ConstructList (in unnamed module @0x4563e9ab) cannot access class com.sun.javafx.collections.ObservableListWrapper (in module javafx.base) because module javafx.base does not export com.sun.javafx.collections to unnamed module @0x4563e9ab
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(Unknown …Run Code Online (Sandbox Code Playgroud) 这听起来像是一个愚蠢的问题,但我很快就会明白这一点.无论如何,如果我要return;在Java中添加一个void方法的结尾,是否会有任何(我的意思是ANY)对性能的影响?例如:
原始方法:
public void method(){
int i = 1;
}
Run Code Online (Sandbox Code Playgroud)
新方法:
public void method(){
int i = 1;
return;
}
Run Code Online (Sandbox Code Playgroud)
现在,显然这对程序的性能没有任何重大影响,但它会有一个微不足道的影响吗?如果它不以任何方式改变性能,它会改变其他什么吗?(就像编译程序的大小一样?)
假设我有一个带有静态字段的类,其默认值设置为:
public class MyClass {
public static int numb = 10;
}
Run Code Online (Sandbox Code Playgroud)
现在,在程序运行期间,我将如何检查MyClass的numb字段设置为默认值(在这种情况下,10)?
从我的角度来看,在代码中,我不知道该字段默认设置为什么,而我不是设置该字段的那个,所以我不能"简单地检查是否" numb == 10.我必须能够检查它是否设置为源代码中声明的内容.
我有一个实现两个接口的对象(特别是Serializable和java.security.Key接口).该对象的类还有两个静态方法:一个接受一个Serializable对象,另一个接受一个Key对象.这是一些示例代码:
public class Subclass implements Serializable, java.security.Key{
public static void test(Serializable s) {
System.out.println("Ser");
}
public static void test(java.security.Key k) {
System.out.println("Key");
}
public static void main(String[]args){
test(new Subclass());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行上面的main方法时,不会抛出任何错误,Java会调用该test(Key)方法.但是,当我将Serializable界面更改为其他内容(我更改其中的参数test(Serializable)并将其更改为超级界面Subclass)时,我的IDE会显示错误:
该方法
test(Key)对于该类型是不明确的SubClass.
我想知道的是,为什么Java允许这种方法与Serializable界面模糊不清?
我正在寻找一种方法来允许这个类的构造函数接受泛型类型的数组.
public class my
{
public my(T[] arr) // how resolve this
{
...
}
}
Run Code Online (Sandbox Code Playgroud) 嗨,我试图返回两个数组,1作为字符串,另一个作为浮点数; 返回我在网上搜索它是令人困惑的,我是新来的oops
public String[][] loadcost(String[][] arr2, int tcount) {
int f1 = 1;
int f2 = 0;
int[] costarr = null ;
while (f2 < tcount){
arr2[f1][f2] = cost.nextLine();
costarr[f2] = Integer.parseInt (arr2[f1][f2]);
f2 = f2 + 1;
}
Arrays.sort(costarr);
return arr2 , costarr ;
Run Code Online (Sandbox Code Playgroud)
我最初的要求是对二维数组进行排序,它使用我在网上得到的代码
BBB 444 DDD 098 FF 19.01
想用第二列排序
在C++中,相等运算符的关联性是从左到右,如此处和此处所述,赋值操作的返回值是分配给给定变量的值.(如图所示这里,这里,这里,并在这里,(部分6.5.16,在最后一个环节101-104页).)
根据这些信息,这个:
double d = 5;
if (d == (d = 6))
cout << "but d was 5...!!!" << endl;
else
cout << "5!=6 :)" << endl;
Run Code Online (Sandbox Code Playgroud)
应该打印,"5!=6 :)"因为表达式,(d == (d = 6))相当于(5 == (6))(这是假的),而是"but d was 5..."打印.有谁能解释为什么?
try...catch我的代码在某处有一个构造:
try {
// Some code.
} catch (Exception e) {
if (condition) {
// Break out of catch block.
}
// Continue catch block.
}
Run Code Online (Sandbox Code Playgroud)
如何标记我的catch块,以便可以break LABEL_NAME;代替编写// Break out of catch block.,以便执行try...catch完全退出该构造?
我希望能够在catch关键字之前放置标签:
try { }
LBL: catch(Exception e) { }
Run Code Online (Sandbox Code Playgroud)
因为标签在许多其他语言结构(例如LBL: if(...或LBL: for(...)中会位于关键字之前,但会引起语法错误。
我也无法在catch(Exception e)代码后放置标签。
这个问题纯粹是出于好奇的人们如何能在Java中实现这一点。我非常清楚,还有其他方法可以控制代码块中的执行流程。
如果我曾经碰到这些代码已经贴上了catch使用标签从块或一些类似的块,和休息,我想知道到底是什么代码在做什么,它是如何做的。