我学习和试验Java泛型已经有一段时间了,但我遇到了一些我无法解释的问题。以以下代码为例:
public class Question {
public <T> Sub<T> getSub(Class<T> c) {
return new Sub<T>(c);
}
public class Sub<S> {
private Class<S> c;
public Sub(Class<S> c) {
this.c = c
可能重复:
有人能澄清为什么编译器(Java1.6)不接受iterate1()吗?我不明白为什么iterate2()和iterate3()要好得多。
import java.util.Collection;
import java.util.HashSet;
public class Test<T> {
public Collection<String> getCollection() {
return new HashSet<String>();
}
public void iterate1(Test
这是用Java思考的结果
class Snow {}
class Powder extends Snow {}
class Light extends Powder {}
class Heavy extends Powder {}
class Crusty extends Snow {}
class Slush extends Snow {}
public class AsListInference {
public static void main(String[] args) {
//The book says it won't compile, but
考虑下面的代码片段。
package spoon;
import rx.Observable;
import java.util.*;
public class Test {
public void test() {
Observable o = new Observable();
}
}
这段代码在Java 11中编译得很好,尽管我认为它不应该编译。Observable也是中的一个java类,我不明白编译器如何知道是使用java.util中的Observable还是我的自定义包rx。
注意,java.util.Observable在Java9中被否决了,但
我在一本书里偶然发现了下面的内容-
//Here, T is bound by Object by default.
class Gen<T> {
T ob; // here, T will be replaced by Object
Gen(T o) {
ob = o;
}
//Return ob.
T getob() {
return ob;
}
}
// Here, T is bound by String.
class GenStr<T extends String> {
T
我正在尝试用java做以下事情:
public class ClassName<E> extends E
然而,这样做,我得到了一个:
error: unexpected type
是不是简单地说,java不能做到这一点?-如果是这样的话,我将如何实现这一效果?它在C++中完美地工作,使用模板,类似于:
template<typename E>
class ClassName: public E
我真正想要实现的是,能够以这种方式将类链接在一起,以达到java中多重继承的效果。
Test.java:
import java.util.ArrayList;
import java.util.Stack;
import java.util.Iterator;
class Wrapper<T> {
public T content;
public ArrayList<Wrapper> children;
}
public class Test {
public static void testing (Stack<Wrapper> stack) {
Wrapper test = stack.po
我不是一个有经验的程序员,我对java也知之甚少。
我有一个用java1.5编译的有10年历史的小java软件。很明显,我没有源代码。这个软件有一个小bug,所以我用了一个java反编译器,找到了这个bug。解决方案很简单,但是我在重新编译这个类时遇到了困难。我正在使用java1.5.0_12重新编译。
不幸的是,编译器似乎在代码中遇到了一些错误。
it/cp/pacm/dbsync/Synchronizer.java:234: possible loss of precision
found : int
required: char
/* 287 */ c = Intege
我认为我对Java泛型有一些很好的理解。
这个代码不编译,我知道原因。
我们可以通过测试方法--只有动物或它的超级类型的列表(比如对象列表)
package scjp.examples.generics.wildcards;
import java.util.ArrayList;
import java.util.List;
class Animal {}
class Mammal extends Animal {}
class Dog extends Mammal {}
public class Test {
public void test(List<? super
在使用jre1.8.0_66运行的代码中,我得到了一个奇怪的异常:
Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception
at java.lang.invoke.CallSite.makeSite(CallSite.java:341)
at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
at java.
我正在尝试理解java的行为。使用此接口:
public interface IA {}
public interface IB extends IA {}
public class myClass implements IB {}
我重载了一个方法,如下所示:
public void method(IA a);
public void method(IB b);
当使用以下对象调用方法时:
IA a = new myClass();
method(a);
为什么java使用:
public void method(IA a);
而不是
public void method(IB b);
如何将Long和Int与assertEquals和Kotlin和Junit进行比较
例如
var size: Int = 20
var totalElements: Long = 20
assertEquals(size, totalElements)
java.lang.AssertionError: expected: java.lang.Integer<20> but was: java.lang.Long<20>
Expected :java.lang.Integer<20>
Actual :java.lang.Long<20>
我已经从网上下载了一个简单的java示例,我正在尝试编译下面给出的代码
package ArrayList;
import java.util.ArrayList;
public class SimpleArrayListExample {
public static void main(String[] args) {
//create an ArrayList object
ArrayList<String> arrayList = new ArrayList<String>();
/*
好了,我正在设置我自己的XML序列化(我知道还有其他的,甚至一些内置在Java中,但我自己做它是为了学习,因为使用它太棒了)。我把序列化写下来了。我目前正在进行反序列化(读取XML文件并根据文件中的数据组装对象),并且在设置泛型类型方面遇到了问题。经过广泛的研究,我想出了如何获取类的泛型类型,以便在序列化时编写它们,但我不知道如何做到这一点:
Class c = Class.forName(string);
ArrayList<c> list = new ArrayList<c>();
我已经在Java语言中看到了一些关于这个问题的答案,但显然C#比C#更通用一些,我无
我已经发现,用例1和用例3可以编译而没有错误,但是案例2。(SubClassB扩展了SuperClassA,这是抽象类)我想知道的是,为什么案例1和案例3没有编译错误。如果是JDK错误,为什么案例2不能通过强制转换检查?
// case 1
List<SuperClassA> a = new ArrayList<>();
SubClassB b = (SubClassB) a;
// case 2
List<Number> m = new ArrayList<>();
Long n = (Long) m; //Error:(x
简单的java程序,它有一个包含少量元素的ArrayList。在编译时,我得到了以下错误:注意: test.java使用未经检查或不安全的操作。注意:有关详细信息,请使用-Xlint:unchecked重新编译。
import java.util.*;
public class test{
public static void main(String[] args){
ArrayList obj = new ArrayList<>();
obj.add("A");
obj.add("B");
我有一份清单:
List<Map<String, Integer>> list = new ArrayList<>();
还有一种方法:
public void doSth(List<Map<String, ?>> list) {
}
这样称呼它:
doSth(list);
显示此错误:
incompatible types: java.util.List<java.util.Map<java.lang.String,java.lang.Integer>> cannot be converted to jav
在Java 7中,选中方法的不同类型会导致编译错误,而在Java 8中没有编译错误。有没有可能保持泛型处于选中状态,并使其在Java8中产生编译错误?
class CheckedEquals{
public static <T> boolean checked(T expected, T actual) {
return com.google.common.base.Objects.equal(expected, actual);
}
}
class ShouldFailAtCompileTime{
public void foo(){
我读到了Java的类型擦除。
类型擦除何时发生?在编译时还是运行时发生?当类加载的时候?当类被实例化时?
很多站点(包括上面提到的官方教程)都说类型擦除发生在编译时。如果类型信息在编译时被完全删除,那么当使用泛型的方法被调用时没有类型信息或错误类型信息时,JDK如何检查类型兼容性?
考虑以下示例:假设类A有一个方法,empty(Box<? extends Number> b)。我们编译A.java并获得类文件A.class。
public class A {
public static void empty(Box<? extends Number> b) {}
我正在实现一个系统,其中我有一个名为'MyMethod‘的接口(名称是任意的),许多小类都在实现这个方法(特别是为了覆盖它的'call’方法),我正在使用多态性将这些方法的实例创建到一个列表中。
问题是,因为我有很多实现该方法的小类,所以将这些类放在同一个java文件(MyMethod.java)中会更容易,如下所示:
public interface MyMethod {
public String call(foo param1, bar param2) throws SQLException, IOException;
}
class FooMethod1 im
我有一个愚蠢的Java问题,这里有一个场景
Class A {}
Class AA extends A{}
AA aa = new AA()
A a = new A()
当我这样做的时候
aa = (AA) a;
我得到了一些错误,如在线程“主”java.lang.ClassCastException中的异常:A不能强制转换为AA
问题出在哪里?
如果我试图将一个String转换为一个java.util.Date,那么java.util.Date编译器就会捕获这个错误。那么为什么编译器不将下面的标记标记为错误呢?
List<String> strList = new ArrayList<>();
Date d = (Date) strList;
当然,JVM在运行时抛出一个ClassCastException,但是编译器没有标记它。
javac 1.8.0_212和11.0.
我有一个简单的泛型方法,它创建一个包含n个元素的列表并返回它:
import java.util.*;
class A {
public static <T> List<T> init(int n) {
List<T> l = new ArrayList<T>();
while (n --> 0) l.add(null);
return l;
}
public static void main(String[] args) {
List<Strin
在学习Java泛型时,我想知道是否可以声明一个接收两个参数的方法,第一个参数是泛型类型T,第二个参数是泛型类型S,它是T的扩展(或与T相同的类型)。因此,我开始对此进行实验,并编写了以下方法声明:
public static <T, S extends T> void testMethod(T t, S s)
{
System.out.println("We are inside testMethod.");
}
然后,我以两种方式调用此方法,如下所示:
java.lang.Integer num1 = new java.lang.Integer(0);
j
我在view.fxml中创建了一个表视图,它引用了控制器类中的table(TableView变量)。showFilesTableView()是initialize()方法中的调用。
public void showFilesTableView() {
TableColumn Name = new TableColumn<AllInfo,String>("Name");
Name.setCellFactory(new PropertyValueFactory<AllInfo, String>("name"));
我有这样的代码:
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
class B { }
class C extends B { }
class D { }
class Test {
void test() {
List<B> lb = new ArrayList<B>();
List<C&g