小编Krö*_*röw的帖子

Java无法从原始泛型类型列表转换为通配符泛型类型列表

这是一个快速的小通用类,使这个问题更容易理解.如果你愿意,你可以假装它"装箱"一个值.

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 BoxBox参数化都可以同时传递给彼此的类型.

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 generics raw-types

5
推荐指数
0
解决办法
213
查看次数

Java,IllegalAccessorError:超类访问检查失败

我一直在用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)

java java-9

3
推荐指数
2
解决办法
3862
查看次数

"回归"吗?在Java的void方法结束时对性能有任何影响?

这听起来像是一个愚蠢的问题,但我很快就会明白这一点.无论如何,如果我要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)

现在,显然这对程序的性能没有任何重大影响,但它会有一个微不足道的影响吗?如果它不以任何方式改变性能,它会改变其他什么吗?(就像编译程序的大小一样?)

java methods void

2
推荐指数
2
解决办法
407
查看次数

检查字段是否设置为Java中声明的默认值

假设我有一个带有静态字段的类,其默认值设置为:

public class MyClass {

   public static int numb = 10;

}
Run Code Online (Sandbox Code Playgroud)

现在,在程序运行期间,我将如何检查MyClassnumb字段设置为默认值(在这种情况下,10)?

从我的角度来看,在代码中,我不知道该字段默认设置为什么,而我不是设置该字段的那个,所以我不能"简单地检查是否" numb == 10.我必须能够检查它是否设置为源代码中声明的内容.

java

2
推荐指数
1
解决办法
211
查看次数

Java - 重载方法接受参数的接口.调用哪种方法,为什么?

我有一个实现两个接口的对象(特别是Serializablejava.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界面模糊不清?

java ambiguous

1
推荐指数
1
解决办法
183
查看次数

如何在类的构造函数中使用泛型类型(Java)

我正在寻找一种方法来允许这个类的构造函数接受泛型类型的数组.

public class my
{

   public my(T[] arr)  // how resolve this
   {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

java generics constructor

1
推荐指数
1
解决办法
4081
查看次数

从Java中的单个方法返回两个不同的对象

嗨,我试图返回两个数组,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

想用第二列排序

java

1
推荐指数
1
解决办法
902
查看次数

平等运算符优先级不起作用

在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..."打印.有谁能解释为什么?

c++ associativity

0
推荐指数
1
解决办法
87
查看次数

如何标记并突破捕获块?

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使用标签从块或一些类似的块,和休息,我想知道到底是什么代码在做什么,它是如何做的。

java break

0
推荐指数
2
解决办法
124
查看次数