小编Tob*_*lte的帖子

eclipse编译器或javac中的错误("T的类型参数无法确定")

以下代码

public class GenericsTest2 {

    public static void main(String[] args) throws Exception {
        Integer i = readObject(args[0]);
        System.out.println(i);
    }

    public static <T> T readObject(String file) throws Exception {
        return readObject(new ObjectInputStream(new FileInputStream(file)));
        // closing the stream in finally removed to get a small example
    }

    @SuppressWarnings("unchecked")
    public static <T> T readObject(ObjectInputStream stream) throws Exception {
        return (T)stream.readObject();
    }
}
Run Code Online (Sandbox Code Playgroud)

在eclipse中编译,但不在javac中编译(T的类型参数无法确定;对于具有上限T,java.lang.Object的类型变量T,不存在唯一的最大实例).

当我将readObject(String文件)更改为

    @SuppressWarnings("unchecked")
    public static <T> T readObject(String file) throws Exception {
        return (T)readObject(new ObjectInputStream(new FileInputStream(file)));
    }
Run Code Online (Sandbox Code Playgroud)

它在eclipse和javac中编译.谁是正确的,eclipse编译器还是javac?

java eclipse generics

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

Java Webstart和URLConnection缓存API

URLConnection缓存API的描述表示为最后一句:

Java 2 Standard Edition中没有URLConnection缓存的默认实现.但是,Java Plugin和Java WebStart确实提供了一个开箱即用的功能.

在哪里可以找到有关Webstart ResponseCache的更多信息?

  • Webstart的哪些版本在哪些平台上激活缓存?
  • 它在哪些情况下有效?只有HTTP获取?
  • 可以配置吗?
  • 源代码是否可用?

背景:

情况1

使用以下(groovy)代码

def url = new URL('http://repo1.maven.org/maven2/')
def connection = url.openConnection()
def result = connection.inputStream.text
Run Code Online (Sandbox Code Playgroud)

我希望每次执行代码时都会联系服务器.但是在执行时

Java Web Start 10.9.2.05
JRE-Version verwenden 1.7.0_09-b05 Java HotSpot(TM) Client VM
Run Code Online (Sandbox Code Playgroud)

行为是不同的.第一次执行代码时,会联系服务器.所有后续的代码执行都不涉及与服务器的任何通信(使用wireshark跟踪).

但它变得更加奇怪.重新启动webstart应用程序后,第一次执行代码时,http://repo1.maven.org/maven2/.pack.gz请求url 导致a 404.仅请求原始网址导致a 304 NOT MODIFIED.所有后续执行都不涉及与服务器的任何通信.

我认为通过缓存功能透明地增强urlconnection的方法很好,很好,有助于提高客户端应用程序的性能.但由于本例中的服务器没有定义Expires头,也没有定义缓存控制头,我认为上面的代码应该总是询问服务器而不是默默地忽略我的请求.

案例2

以下代码在使用webstart 10.1.1.255执行时不起作用(这是由java 7的早期测试版安装的,但我不知道这是哪一个)

URL url = new URL("http://repo1.maven.org/maven2/");
URLConnection connection = url.openConnection();
connection.setRequestProperty("Accept-Encoding", "gzip");
connection.connect();
InputStream is = connection.getInputStream();
if ("gzip".equalsIgnoreCase(connection.getContentEncoding()))
{
    is = new …
Run Code Online (Sandbox Code Playgroud)

java caching urlconnection httpurlconnection java-web-start

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

编写自定义Lombok Annotation处理程序

我想编写自定义Lombok Annotation处理程序.我知道http://notatube.blogspot.de/2010/12/project-lombok-creating-custom.html.但是当前的lombok jar文件不包含许多.class文件,而是包含名为.SCL.lombok的文件.

我发现,.SCL.lombok文件是.class文件,Lombok的构建脚本在生成jar文件时重命名它们,而ShadowClassLoader能够加载这些类 - 并且首字母缩略词SCL似乎来自于此.似乎这样做的原因只是"避免使用基于SCL的jar污染任何项目的命名空间.IDE中的自动完成程序除了实际的公共API之外不会提出任何建议."

我只能通过编译我的自定义处理程序

  • 解压缩lombok.jar的内容
  • 将.SCL.lombok文件重命名为.class
  • 将生成的目录添加到编译类路径中

另外,为了能够使用我的自定义处理程序,我需要创建一个包含lombok类和我的自定义处理程序的新fat jar.自定义lombok类加载器实质上阻止在其他多个jar中添加自定义处理程序.

这是扩展Lombok的唯一方法吗?或者我错过了什么?

我使用以下的buildscript

apply plugin: 'java'

repositories {
    jcenter()
}

configurations {
    lombok
    compileOnly
}

def unpackedAndRenamedLombokDir = file("$buildDir/lombok")

task unpackAndRenameLombok {
    inputs.files configurations.lombok
    outputs.dir unpackedAndRenamedLombokDir
    doFirst {
        mkdir unpackedAndRenamedLombokDir
        delete unpackedAndRenamedLombokDir.listFiles()
    }
    doLast {
        copy {
            from zipTree(configurations.lombok.singleFile)
            into unpackedAndRenamedLombokDir
            rename "(.*)[.]SCL[.]lombok", '$1.class'
        }
    }
}

sourceSets {
    main {
        compileClasspath += configurations.compileOnly
        output.dir(unpackedAndRenamedLombokDir, builtBy: unpackAndRenameLombok)
    }
}

tasks.compileJava {
    dependsOn unpackAndRenameLombok
}

dependencies …
Run Code Online (Sandbox Code Playgroud)

java lombok

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

如何显示学分

我想赞扬我们在(商业)应用程序中使用的所有开源库.我想在我们的about对话框中显示一个HTML页面.我们的构建过程使用ant,第三方库在svn中提交.

您认为生成HTML页面的最佳方式是什么?

  • 硬编码HTML页面?
  • 将依赖关系管理切换到apache-ivy并编写一些ant任务来生成html
  • 使用maven-ant-tasks并编写一些ant任务来生成HTML
  • 仅使用maven来处理依赖项和HTML一次,下载并提交它们.其余的由未更改的ant脚本完成
  • 切换到maven2(嘿老大,我想切换到maven,1个月内构建可能再次工作......)
  • ...

关于对话显示的内容应该是什么?

  • 图书馆名称
  • 执照
  • 作者
  • 主页
  • 通过链接到源存档进行的更改
  • ...

有一些最佳实践建议吗?一些很好的例子(应用程序有一个很好的对话框显示依赖关系)?

dependencies open-source maven-2 ivy

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

在不破坏构建的情况下将泛型引入Java代码

以下代码无法编译:

public class GenericsTest {    
    public static void main(String[] args) {
        MyList<?> list = new MyList<Object>();
        Class<?> clazz = list.get(0);

        // Does not compile with reason 
        // "Type mismatch: cannot convert from Object to Class"
        MyList list2 = new MyList();
        Class clazz2 = list2.get(0);
    }
    static class MyList<T> extends ArrayList<Class<T>> {
    }
}
Run Code Online (Sandbox Code Playgroud)

我想这样做是为了在不破坏构建的情况下将泛型引入旧代码.

这是编译器(eclipse和javac)中的错误还是我在这里遗漏了什么?将泛型引入MyList还有什么其他可能性?

编辑

为了澄清:

我有通用类

public class MyList extends ArrayList<MyObject> {}
Run Code Online (Sandbox Code Playgroud)

public class MyObject {}
Run Code Online (Sandbox Code Playgroud)

和使用MyList的代码

MyList list = new MyList();
...
MyObject o = list.get(0); …
Run Code Online (Sandbox Code Playgroud)

java generics

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