小编gde*_*ohn的帖子

无法在Javadoc注释中链接到JDK10

从Java 9升级到10后,链接到JDK不再工作时的Javadoc工具生成的文件(例如,对于文件导入java.util.Optional,{@link Optional}呈现为Optional而不是作为Optional;同一个问题有@see,@param,@return,和其他地方,你通常看到的Javadoc链接).

我有一个简单的模块化项目,我使用Maven用的Javadoc插件(sourcetarget选项设置10configuration编译器插件部分).我的理解是,默认情况下它会传递-link https://docs.oracle.com/javase/10/docs/api/给Javadoc工具.我的理解是,从历史上看,Javadoc工具期望一个名为的文本文件package-list存在于被告知要查找外部文档的URL中.Java 8 有一个.Java 9 有一个.Java 10 没有(404错误).显然,Javadoc工具现在输出一个名为element-list而不是package-list模块化项目的文本文件,但似乎也没有提供(Java 9没有提供,但它可用于早期访问的Java 11版本).

通过IntelliJ生成Javadoc并Link to JDK documentation启用该选项会产生相同的结果.它说,它传递-link https://docs.oracle.com/javase/10/docs/api/javadoc.exe,并报告javadoc: error - Error fetching URL: https://docs.oracle.com/javase/10/docs/api/.尽管有错误,它确实输出了Javadoc,但与Maven一样,没有JDK链接.

这应该怎么样?当他们将JDK文档放到网上时,Oracle是否搞砸了?

我的相关部分pom.xml:

<build>
    <plugins>
        <plugin> …
Run Code Online (Sandbox Code Playgroud)

java javadoc maven maven-javadoc-plugin java-10

22
推荐指数
3
解决办法
2120
查看次数

Allman风格的匿名课程

有关如何使用匿名类同时保持与Allman缩进样式一致的任何建议?我真的不喜欢我想出的任何事情,例如

// Pass as parameter.
foo(new Clazz( )
    {
       // Do stuff.
    });

// Assign to variable.
Clazz bar = new Clazz( )
            {
               // Do stuff.
            };
Run Code Online (Sandbox Code Playgroud)

java coding-style anonymous-class

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

在Java中转换为泛型方法类型变量时的编译器警告

编辑:我最初接受了我的答案,但我并不满意,因为我想要正确使用泛型.所以,我一直在做研究并找到了解决方案.请在下面的答案中阅读相关内容.


这是一段自包含的Java代码,展示了我正在尝试做的事情.它可以正确编译,运行和运行.

 1 import java.lang.reflect.Method;
 2 import java.lang.reflect.InvocationTargetException;
 3 
 4 public class Example
 5 {
 6    public static <T> void foo(Method method, String target, Object argument, T expectedReturn) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
 7    {
 8       T actualReturn = (T) method.invoke(target, argument);
 9       System.out.print(actualReturn.equals(expectedReturn));
10    }
11    
12    public static void main(String[ ] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
13    {
14       foo(String.class.getMethod("charAt", int.class), "test", 1, 'e');
15    }
16 }
Run Code Online (Sandbox Code Playgroud)

运行此打印true到控制台,这是我所期望的.令我困扰的是,由于第8行的演员表,我在编译时会收到警告,如下所示(顺便说一句,jGRASP是我的IDE).

---- jGRASP exec:javac -g -Xlint:未选中Sandbox.java …

java generics reflection casting

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

动态实例化嵌套在抽象类中的内部类

我理解为了实例化一个内部类(即非静态),你需要一个封闭类的实例.如果封闭类是抽象的(不要问),这会使事情变得复杂一些.考虑以下.

abstract class Outer {
   class Inner {}
}
Run Code Online (Sandbox Code Playgroud)

Inner例如,实例化仍然可以静态地使用,例如,匿名类,就像这样.

Inner instance = new Outer() {}.new Inner();
Run Code Online (Sandbox Code Playgroud)

但那么如何动态地完成同样的事情Constructor.newInstance呢?(请注意,我动态地说;假设您不知道外部类的名称.)您需要根据JLS 15.9.3传递第一个参数的封闭类的实例,如果有办法的话为了满足抽象参数而动态创建东西,我不知道它(任何想法的奖励积分).

长话短说,我最终意外地传入null,就像这样.

Constructor<Inner> constructor = Inner.class.getDeclaredConstructor(Outer.class);
Object argument = null;
Inner instance = constructor.newInstance(argument);
Run Code Online (Sandbox Code Playgroud)

想象一下,当有效时我会感到惊讶.我的问题是,为什么这样做?这会一直有效吗?

java reflection abstract-class instantiation inner-classes

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

为什么封闭类不包含在内部类构造函数的泛型参数中?

看看这个.

import java.lang.reflect.*;
import java.util.Arrays;

class Test {
    class Inner {
        public <T> Inner(T arg) {}
    }

    public static void main(String[] args) {
        Constructor<?> constructor = Test.Inner.class.getConstructors( )[0];
        System.out.println(
            "Regular parameters: " +
            Arrays.toString(constructor.getParameterTypes()) +
            "\nGeneric parameters: " +
            Arrays.toString(constructor.getGenericParameterTypes())
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此打印以下内容.

常规参数:[类Test,类java.lang.Object]
通用参数:[T]

我对Java内部类(即非静态)的理解是它们的构造函数隐式地为它们的封闭类提供了一个参数.因此,要获取实例Inner,您可以像这样调用它的构造函数.

Test.Inner foo = new Test().new Inner(new Object());
Run Code Online (Sandbox Code Playgroud)

实际发生的是将实例Test传递给构造函数Inner(以及任何其他参数),并将其分配给隐式实例字段.

检查这个结构的nullary构造函数Inner,因为调用getParameterTypes返回一个包含Class表示TestObject(擦除T)的对象的数组.

但是,由于构造函数是通用的,因此调用getGenericParameterTypes将返回仅包含类型变量的数组T.缺少封闭类的隐式参数.

只有当内部类构造函数声明一个类型变量时,才会发生这种情况.为什么这样做?这是一个错误吗?

java generics reflection

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

scanf和fgets有问题

这是为家庭作业分配一些给定的字符串.我正在提示用户他们想要排序scanf的字符串数量,根据该数字分配一个数组,然后自己获取字符串fgets.

如果字符串的数量是硬编码的,那么一切正常,但是scanf让用户决定搞砸了.这是代码:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

#define LENGTH  20 // Maximum string length.

int main(void)
{
    int index, numStrings = 0;
    char **stringArray;
    printf("Input the number of strings that you'd like to sort: ");
    assert(scanf("%d", &numStrings) == 1);
    stringArray = (char **)malloc(numStrings * sizeof(char *));

    for (index = 0; index < numStrings; index++)
    {
        stringArray[index] = (char *)malloc(LENGTH * sizeof(char));
        assert(stringArray[index] != NULL);
        printf("Input string: ");
        assert(fgets(stringArray[index], LENGTH, stdin) != NULL);
    } …
Run Code Online (Sandbox Code Playgroud)

c stdin scanf fgets

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

锡兰的无限可迭代发电机

在Ceylon中有一种简单的方法可以创建一个无限的迭代,它通过调用相同的no-args函数来生成每个元素吗?换句话说,语言模块是否提供了与Java 8相同的功能Stream.generate(Supplier<T>)

ceylon

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

如何通过反射访问抽象父类中的实例字段?

因此,例如,StringBuilder继承自抽象类AbstractStringBuilder.据我了解,StringBuilder本身没有字段(除了serialVersionUID).相反,它的状态由字段表示,AbstractStringBuilder并通过调用super它覆盖的方法的实现来操纵.

是否有一种方法通过反射来获取声明的私有char数组与特定的实例相关联?这是我得到的最接近的.valueAbstractStringBuilderStringBuilder

import java.lang.reflect.Field;
import java.util.Arrays;

public class Test
{
   public static void main(String[ ] args) throws Exception
   {
      StringBuilder foo = new StringBuilder("xyzzy");
      Field bar = foo.getClass( ).getSuperclass( ).getDeclaredField("value");
      bar.setAccessible(true);
      char[ ] baz = (char[ ])bar.get(new StringBuilder( ));
   }
}
Run Code Online (Sandbox Code Playgroud)

这让我得到了一个包含十六个空字符的数组.请注意,我正在寻找涉及反射的解决方案,因为我需要一种不限于此的通用技术StringBuilder.有任何想法吗?

java reflection abstract-class

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